• 二叉搜索树的非递归前中后序遍历 【微软面试100题 第四十三题】


    题目要求:

      实现二叉搜索树的前序、中序、后序非递归遍历。

    题目分析:

      非递归前序遍历:使用一个辅助栈,出栈一个结点并输出该结点,同时依次入栈该结点的右结点和左结点,再出栈,入栈...;

      非递归中序遍历:使用一个辅助栈和一个临时结点,临时结点不断找树的左子树,知道为空,然后又跳到空结点父结点的右子树,又继续找右子树的左子树;

      非递归后序遍历:使用两个辅助栈。

    代码实现:

    #include <iostream>
    #include <stack>
    
    using namespace std;
    
    typedef struct BinaryTree
    {
        struct BinaryTree *left,*right;
        int data;
    }BinaryTree;
    
    void initTree(BinaryTree **p);
    void PreOrderTree(BinaryTree *p);
    void InOrderTree(BinaryTree *p);
    void PostOrderTreeTraversal(BinaryTree *p);
    
    int main(void)
    {
        BinaryTree *root;
        initTree(&root);
        PreOrderTree(root);
        InOrderTree(root);
        PostOrderTreeTraversal(root);
        return 0;
    }
    void PreOrderTree(BinaryTree *p)
    {
        stack<BinaryTree *> s;
        s.push(p);
        cout << "二叉搜索树的非递归前序遍历为:";
        while(!s.empty())
        {
            BinaryTree *tmp = s.top();
            cout << tmp->data << " ";
            s.pop();
            if(tmp->right)
                s.push(tmp->right);
            if(tmp->left)
                s.push(tmp->left);
        }
        cout << endl;
    }
    void InOrderTree(BinaryTree *p)
    {
        stack<BinaryTree *> s;
        BinaryTree *cur = p;
        cout << "二叉搜索树的非递归中序遍历为:";
        while(!s.empty() || cur!=NULL)
        {
            if(cur!=NULL)
            {
                s.push(cur);
                cur = cur->left;
            }
            else
            {
                cur = s.top();
                s.pop();
                cout << cur->data << " ";
                cur = cur->right;
            }
        }
        cout << endl;
    }
    void PostOrderTreeTraversal(BinaryTree *p)
    {
        stack<BinaryTree *> sTraversal,sVisit;
        sTraversal.push(p);
        while(!sTraversal.empty())
        {
            BinaryTree *tmp = sTraversal.top();
            sTraversal.pop();
            sVisit.push(tmp);
            if(tmp->left)
                sTraversal.push(tmp->left);
            if(tmp->right)
                sTraversal.push(tmp->right);
        }
        cout << "二叉搜索树的非递归后序遍历:";
        while(!sVisit.empty())
        {
            cout << sVisit.top()->data << " ";
            sVisit.pop();
        }
        cout << endl;
    }
    //      10
    //     / 
    //    5   12
    //   / 
    //  4   7
    void initTree(BinaryTree **p)
    {
        *p = new BinaryTree;
        (*p)->data = 10;
     
        BinaryTree *tmpNode = new BinaryTree;
        tmpNode->data = 5;
        (*p)->left = tmpNode;
     
        tmpNode = new BinaryTree;
        tmpNode->data = 12;
        (*p)->right = tmpNode;
        tmpNode->left = NULL;
        tmpNode->right = NULL;
     
        BinaryTree *currentNode = (*p)->left;
     
        tmpNode = new BinaryTree;
        tmpNode->data = 4;
        currentNode->left = tmpNode;
        tmpNode->left = NULL;
        tmpNode->right = NULL;
     
        tmpNode = new BinaryTree;
        tmpNode->data = 7;
        currentNode->right = tmpNode;
        tmpNode->left = NULL;
        tmpNode->right = NULL;
        
        cout << "二叉搜索树为:" <<endl;
        cout << "     " << 10<<endl;
        cout << "    " <<"/" << "  "<< "\" <<endl;
        cout << "   " << 5 << "    " << 12 << endl;
        cout << " " <<"/" << "  "<< "\" <<endl;
        cout << 4 << "    " << 7 << endl;
    }

      

  • 相关阅读:
    mui 关闭除指定页面之外的其他所有页面.
    javascript 工厂模式
    DOM事件对象与IE事件对象
    animation属相详解
    webpack概念
    小程序获取form_id 与 小程序获取openid
    小程序分享自定义样式
    node生成图片
    小程序弹出层点透问题
    pm2配置文件介绍
  • 原文地址:https://www.cnblogs.com/tractorman/p/4079966.html
Copyright © 2020-2023  润新知