二叉树的各种遍历方法

一、递归

先序遍历

void PreOrderRecur(TreeNode *head){
    if(head==NULL) return;
    std::cout<<head->value<<std::endl;
    PreOrderRecur(head->left);  
    PreOrderRecur(head->right;    
}

中序遍历

void InOrderRecur(){
    if(head==NULL) return;
    InOrderRecur(head->left);
    std::cout<<head->value<<std::endl;  
    InOrderRecur(head->right;  
}

后序遍历

void PostOrderRecur(){
    if(head==NULL) return;
    PostOrderRecur(head->left);
    PostOrderRecur(head->right;
    std::cout<<head->value<<std::endl;    
}

二、非递归

先序遍历

孩子结点入栈的时候,是右结点先入栈,保证左结点在上面先出栈

void PreOrderUnRecur(TreeNode *head){
    if(head != NULL){
        stack<int> mystack;
        mystack.push(head);
        while(!mystack.empty()){
            head = mystack.top(); //弹栈
            std::cout<<head->value<<std::endl;
            mystack.pop();
            if(head->right !=NULL) //先右
                mystack.push(head->right);
            if(head->left !=NULL) //再左
                mystack.push(head->left);
        }
    }
}

中序遍历

void InOrderUnRecur(TreeNode *head){
    if(head != NULL){
        stack<int> mystack;
        while(!mystack.empty()){
            if(head != NULL){ //一直向左压栈直到空指针
                mystack.push(head);
                head = head->left;
            }else{
                head = mystack.top(); //以下三句弹栈访问
                mystack.pop();
                std::cout<<head->value<<std::endl;
                head = head->right; //向左,重复以上步骤
            }
        }
    }
}

后序遍历 !!!

void PostOrderUnRecur(TreeNode *head){
    if(head !=NULL){
        stack<int> mystack;
        mystack.push(head);
        TreeNode *c =NULL;

        while(!mystack.empty()){
            c = mystack.top(); //栈顶结点
            if(c->left != NULL && head != c->left && head != c->right) //head 为最近访问的结点
                mystack.push(c->left)
            else if(c->right != NULL && head != c->right)
                mystack.push(c->right)
            else{
                std::cout<<c->val<<std::endl;
                mystack.pop();
                head = c;
            }
                
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 酷暑学开车,烈日无蓬遮。 吾不埋怨苦,梦想作鼓舞。
    时时反省阅读 289评论 2 9
  • “像我这么善良的人还去哪儿找啊”,以前的我经常这么说。但是最近我越来越意识到自己一点儿也不善良。我写这篇只是发现了...
    雪糕同学阅读 1,560评论 0 0
  • 对手机程序板块的熟悉程度,大家几乎都了解,以往的抖音软件,逐渐变成了禁区。很多相关写手,都在网上发稿子,强调抖音区...
    我是你的福星阅读 432评论 0 7
  • 51、对称加密算法和非对称加密算法 对称加密算法 对称加密才用了对称密码编码技术,它的特点是文件加密和解密使用...
    cpp加油站阅读 679评论 0 7