根据数组建立完全二叉树, 前序、中序、后序、深度优先遍历、广度优先遍历(层次遍历)的递归和非递归代码

#include <iostream>
#include <vector>
#include <stack>
#include <queue>

using namespace std;

/* 
二叉树前序、中序、后序遍历非递归写法的透彻解析
https://blog.csdn.net/zhangxiangDavaid/article/details/37115355

二叉树的建立和前序、中序、后序、深度优先遍历、广度优先遍历(层次遍历)
*/
 
struct TreeNode{
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
    TreeNode(int x): val(x), left(nullptr), right(nullptr){
    }
};

// 根据数组建立完全二叉树 
TreeNode* CreateNode(vector<int> num, int start, int len){
    if(start>=len)
        return nullptr;
    TreeNode* root = new TreeNode(num[start]);
    root->left = CreateNode(num, start*2+1, len);
    root->right = CreateNode(num, start*2+2, len);
    return root;

// 递归前序遍历 
void ProOrderTraverse(TreeNode* root){
    if(root==nullptr)
        return;
    
    cout<< root->val << " ";
    ProOrderTraverse(root->left);
    ProOrderTraverse(root->right);
}

// 非递归前序遍历
vector<int> ProOrder(TreeNode* root){
    vector<int> res;
    if(root==nullptr)
        return res;
    stack<TreeNode*> s;
    TreeNode* p = root;
    while(p!=nullptr || !s.empty()){
        while(p!=nullptr){
            s.push(p);
            res.push_back(p->val);
            p = p->left;  // 执行到访问到最下面的左子树        
        }
        if(!s.empty()){  //这个if不会循环 只会执行一次 
            p = s.top();
            s.pop();
            p = p->right;
        }
    }
    return res;

// 递归中序遍历 
void MidOrderTraverse(TreeNode* root){
    if(root==nullptr)
        return;
    MidOrderTraverse(root->left);
    cout<< root->val << " ";
    MidOrderTraverse(root->right);    
}

//非递归中序遍历 
vector<int> MidOrder(TreeNode* root){
    vector<int> res;
    if(root==nullptr)
        return res;
    stack<TreeNode*> s;
    TreeNode* p = root;
    while(p!=nullptr || !s.empty()){
        while(p!=nullptr){
            s.push(p);
            p = p->left;
        }
        if(!s.empty()){
            p = s.top();
            s.pop();
            res.push_back(p->val);
            p = p->right;
        }
    }
}

// 递归后序遍历 
void PostOrderTraverse(TreeNode* root){
    if(root==nullptr)
        return;
    PostOrderTraverse(root->left);
    PostOrderTraverse(root->right);    
    cout<< root->val << " ";
}

// 非递归后序遍历
vector<int> PostOrder(TreeNode* root){
    vector<int> res;
    if(root==nullptr)
        return res;
    
    stack<TreeNode*> s;
    TreeNode* pCur = root;
    TreeNode* pLast = nullptr;
    
    while(pCur){
        s.push(pCur);
        pCur = pCur->left;    
    }
    
    while(!s.empty()){
        pCur = s.top();
        s.pop();
        
        if(pCur->left==nullptr || pCur->right==pLast){
            res.push_back(pCur->val);
            pLast = pCur;            
        }
        else{
            s.push(pCur);
            pCur = pCur->right;
            while(pCur){
                s.push(pCur);
                pCur = pCur->left;
            }
        }        
    }
    return res;        

// 非递归深度优先遍历二叉树 
vector<int> dfs(TreeNode* root){
    vector<int> res;
    if(root==nullptr)
        return res;
        
    stack<TreeNode*> s;
    s.push(root);
    while(!s.empty()){
        TreeNode* pNode = s.top();
        s.pop();
        res.push_back(pNode->val);
        if(pNode->right)
            s.push(pNode->right);
        if(pNode->left)
            s.push(pNode->left);        
    }
    return res;    
}

// 非递归广度优先遍历(层次遍历)
vector<int> bfs(TreeNode* root){
    vector<int> res;
    if(root==nullptr)
        return res;
    queue<TreeNode*> Q;
    Q.push(root);
    while(!Q.empty()){
        TreeNode* pNode = Q.front();
        Q.pop();
        res.push_back(pNode->val);
        if(pNode->left)
            Q.push(pNode->left);
        if(pNode->right)
            Q.push(pNode->right);
    }
    return res;

int main(int argc, char** argv) {
    vector<int> num{1, 2, 3, 4, 5, 6, 7, 8, 9};
    TreeNode* root = CreateNode(num, 0, 9);
    cout<<"递归前序遍历:"<<endl;
    ProOrderTraverse(root);
    cout<<endl;
    cout<<"递归中序遍历:"<<endl;
    MidOrderTraverse(root);
    cout<<endl;
    cout<<"递归后序遍历:"<<endl; 
    PostOrderTraverse(root);
    cout<<endl; 
    
    vector<int> ap = ProOrder(root);
    vector<int> am = MidOrder(root);     
    vector<int> a= PostOrder(root);
    vector<int> adfs = dfs(root);
    vector<int> abfs = bfs(root);
    
    vector<int>::iterator it1;
    vector<int>::iterator it2;
    vector<int>::iterator it3;
    vector<int>::iterator it4;
    vector<int>::iterator it5;
    
    cout<<"非递归前序遍历:"<<endl; 
    for(it1=ap.begin(); it1!=ap.end(); it1++)
        cout<<*it1 <<" ";
    cout<<endl;
    
    cout<<"非递归中序遍历:"<<endl;
    for(it2=am.begin(); it2!=am.end(); it2++)
        cout<<*it2 <<" ";
    cout<<endl;
    
    cout<<"非递归后序遍历:"<<endl; 
    for(it3=a.begin(); it3!=a.end(); it3++)
        cout<<*it3 <<" ";
    cout<<endl;    
    
    cout<<"二叉树的深度优先遍历:"<<endl;
    for(it4=adfs.begin(); it4!=adfs.end(); it4++)
        cout<<*it4<<" ";
    cout<<endl;
    
    cout<<"二叉树的广度优先遍历(层次遍历):"<<endl;
    for(it5=abfs.begin(); it5!=abfs.end(); it5++)
        cout<<*it5<<" ";
    cout<<endl; 
    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值