无栈非递归中序遍历非线索化二叉树

Posted 哈士奇超帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无栈非递归中序遍历非线索化二叉树相关的知识,希望对你有一定的参考价值。

试设计一个非递归算法,按中根顺序遍历非线索二叉树,但不得用任何辅助。
在执行算法期间,允许改变LLINK和RLINK的值。

 

如何不用辅助栈非递归遍历二叉树呢?
这里给出了一个比较方便的算法,其基本思路是依次将每个结点p左子树的最右结点指向p,
不停回溯,用类似右线索化的方式中序遍历二叉树。

 

具体算法如下所示:

 

1. 若p有左儿子:                          将其左儿子的最右结点(可为左儿子本身)指向p,然后p=p->lchild;

    若p无左儿子或p已经被访问:   p向上回溯(即p=p->rchild),访问p;并恢复回溯所用指针;

 

2.重复上述操作直至二叉树访问完毕。

 

 

实现方式如下图:

 

 

 

                                                   

1.从结点P开始算法                                                          2.P有左儿子,将P左子树最右结点指向P   

                         

                                        

3.P=P->lchild,P仍有左儿子,同上图操作                  4.P=P->lchild,P仍有左儿子,同上图   

 

                                                

5.P=P->lchild,P无左儿子,访问元素6                       6. P左儿子右指针指向P,说明元素6已

P=P->rchild                                                                           访问,则释放元素6指向4的指针,并访问4

 

 

                                                                               

7. P左儿子右指针指向P,说明元素4已访问,         8.P有右儿子,故P=P->rchild,访问元素5                  

     则释放元素4指向2的指针,并访问元素2                                                                                                             

 

                                          

 9.P无左儿子,故P=P->rchild,访问元素1                10.P=P->rchild,访问元素3 

 释放元素5指向元素1的指针

 

 

11.访问完毕

 

 

具体代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct BinaryTree
int data;
struct BinaryTree* lchild ;
struct BinaryTree* rchild ;
BT;
BT* create(int d,BT*l,BT*r);
void traverse(BT *p);

int main()

    BT*t6=create(6,NULL,NULL);
    BT*t5=create(5,NULL,NULL);
    BT*t4=create(4,t6,NULL);
    BT*t3=create(3,NULL,NULL);
    BT*t2=create(2,t4,t5);
    BT*t1=create(1,t2,t3);
    traverse(t1);
    return 0;


BT* create(int d,BT*l,BT*r)

    BT*p=(BT *)malloc(sizeof(BT));
    if(!p) printf("No enough money to allocate!\\n");return NULL;
    p->data=d;
    p->lchild=l;
    p->rchild=r;
    return p;


void traverse(BT *p)

    while(p)
    
        BT *pleft=p->lchild;
        if(pleft)
        
            while(pleft->rchild && pleft->rchild!=p) pleft=pleft->rchild;
            if(!pleft->rchild)
            
                pleft->rchild=p;
                p=p->lchild;
                continue;
            
            else pleft->rchild=NULL;
        
        printf("%d   ",p->data);
        p=p->rchild;
    
    printf("\\n");

 

以上是关于无栈非递归中序遍历非线索化二叉树的主要内容,如果未能解决你的问题,请参考以下文章

超强二叉树解析.必收藏!(数组,链表实现,8种遍历方法,前,中,后序线索化二叉树及其遍历)---风之java

C++线索化二叉树

算法系列之线索化二叉树,前序线索化中序线索化后序线索化以及遍历~

二叉树的非递归遍历(先序中序后序和层序遍历)

线索化二叉树的非递归遍历(用前驱结点和后继访问)

中序线索化二叉树