数据结构 二叉树的非递归遍历算法再回顾

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

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

如图:

该二叉树的前序遍历为: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\t",p->data);
        }
    }
}

 

posted @ 2020-10-10 09:25  雾漫大武汉  阅读(131)  评论(0编辑  收藏  举报