zoukankan      html  css  js  c++  java
  • 数据结构 二叉树的非递归遍历算法再回顾

    这里主要回顾后序遍历算法的主要非递归思想:

    后序遍历可以由前序遍历经过一系列操作推得

    如图:

    该二叉树的前序遍历为:1 2 4 8 5 9 3 6 10 11 7 12 13

    首先找到根节点的左右两边的子树分别以2和3为根,将2和3为根的子树全部按原顺序交换

    所以是2 4 8 5 9和3 6 10 11 7 12 13整体交换可以得到

    1 3 6 10 11 7 12 13 2 4 8 5 9 接着交换以4,5,6,7为根的子树(这里特别注意!若子树的孩子节点只有一个则可以不用交换)

    得到:

    1 3 7 13 12 6 11 10 2 5 9 4 8

    最后将整个序列全部反转,这里我用到的是将这个序列放入一个栈中,然后再出栈就可以起到逆序的作用了

    8 4 9 5 2 10 11 6 12 13 7 3 1

    代码可写为:

    void post_order_Nonrecursion(Node *node)
    {
        if(node!=NULL)
        {
            Node *stack1[MAXSIZE];int top1=-1;
            Node *stack2[MAXSIZE];int top2=-1;
            Node *p=NULL;
            
            stack1[++top1]=node;
            while(top1!=-1)
            {
                p=stack1[top1--];
                stack2[++top2]=p;
                if(p->left!=NULL)
                    stack1[++top1]=p->left;
                if(p->right!=NULL)
                    stack1[++top1]=p->right;
            }
            while(top2!=-1)
            {
                p=stack2[top2--];
                printf("%d	",p->data);
            }
        }
    }
  • 相关阅读:
    423. Reconstruct Original Digits from English
    400. Nth Digit
    397. Integer Replacement
    396. Rotate Function
    365. Water and Jug Problem
    335. Self Crossing
    319. Bulb Switcher
    线段树-hdu2795 Billboard(贴海报)
    线段树---求逆序数
    线段树——单点替换区间最值
  • 原文地址:https://www.cnblogs.com/oldfish123/p/13790223.html
Copyright © 2011-2022 走看看