zoukankan      html  css  js  c++  java
  • 二叉树的前序,中序遍历

    前序递归于循环

    #include <iostream>
    #include <stack>
    using namespace std;
    
    struct TreeNode
    {
        int val;
        TreeNode *left,*right;
    };
    
    void create(TreeNode *&p)
    {
        int k;
        cin>>k; //1 2 0 0 3 0 0;
        if(k!=0)
        {
            p=new TreeNode;
            p->val=k;
            create(p->left);
            create(p->right);
        }
        else
            p=NULL;
    }
    
    void preorder1(TreeNode *p)
    {
        if(p)
        {
            cout<<p->val;
            preorder1(p->left);
            preorder1(p->right);
        }
    }
    
    void preorder2(TreeNode *root)
    {
        stack<TreeNode*> s;
        TreeNode *p=root;
        while(p||!s.empty())
        {
            if(p)
            {
                s.push(p);
                cout<<p->val;
                p=p->left;
            }
            else
            {
                p=s.top();
                s.pop();
                p=p->right;
            }
        }
    }

    中序递归与循环

    void inorder1(TreeNode *p)
    {
        if(p)
        {
            inorder1(p->left);
            cout<<p->val;
            inorder1(p->right);
        }
    }
    
    void inorder2(TreeNode *p)
    {
        stack<TreeNode*> s;
        while(p||!s.empty())
        {
            if(p)
            {
                s.push(p);
                p=p->left;
            }
            else
            {
                p=s.top();
                cout<<p->val;
                s.pop();
                p=p->right;
            }
        }
    }
    
    int main()
    {
        TreeNode *root=new TreeNode;
        create(root);
        //preorder1(root);
        preorder2(root);
        //inorder1(root);
        inorder2(root);
        return 0;
    }

     层次优先遍历

    void levelorder(TreeNode *root)
    {
        deque<TreeNode*> d;
        TreeNode *p=root;
        d.push_back(p);
        while(!d.empty())
        {
            p=d.front();
            cout<<p->val;
            d.pop_front();
            if(p->left)
                d.push_back(p->left);
            if(p->right)
                d.push_back(p->right);
        }
    }

    深度优先遍历

    void depthorder(TreeNode *root)
    {
        stack<TreeNode*> s;
        TreeNode *p=root;
        s.push(p);
        while(!s.empty())
        {
            p=s.top();
            cout<<p->val;
            s.pop();
            if(p->right)
                s.push(p->right);
            if(p->left)
                s.push(p->left);
        }
    }
  • 相关阅读:
    开发中遇到的问题点
    ThreadLocal
    Java多线程10:join()方法
    Java多线程9:中断机制
    Java多线程8:wait()和notify()/notifyAll()
    Java多线程7:死锁
    Java多线程0:核心理论
    MySQL中and和or的优先级的问题
    Java多线程6:Synchronized锁代码块(this和任意对象)
    shiro英语
  • 原文地址:https://www.cnblogs.com/home123/p/7295912.html
Copyright © 2011-2022 走看看