二叉树的遍历

来源:互联网 发布:淘宝怎么搜索旺旺号 编辑:程序博客网 时间:2024/06/06 20:31

先序遍历

1。先遍历根节点,在把右孩子入栈,在把左孩子入栈(最先入栈的右孩子,最后出栈,最后遍历)
2。如果栈不为空,则出栈,并重复第一步。

void preOrderTraverse(BiTree T){    InitStack(S);    Push(S,T);    BiNode * p;    while(!StackEmpty(S)){        Pop(S,p);        visit(p);        if(p->rchild!=null) Push(S,p->rchild);        if(p->lchild!=null) Push(S,p->lchild);    }}

中序遍历

1。从根结点向左遍历并全部入栈,直至无左孩子
2。如果栈不为空,出栈并visit结点,
3。若有右子树,则把右子树作为根结点执行第一步。

void putINStack(BiNode *p,Stack S){    Push(S,p);    while(p->lchild!=null){        Push(S,p->lchild);        p = p->lchild;    }}void InOrderTraverse1(BiNode *p){    InitStack(S);    putINStack(p,S);    BiNode * q;    while(!StackEmpty(S)){        Pop(S,q);        visit(q);        if(q->rchild!=null) putINStack(q->rchild,S);    }}void InOrderTraverse2( BiNode *x) { //二叉树中序遍历算法(迭代版#2)   InitStack(S); //辅助栈   while ( true )      if ( x ) {         Push(S,x); //根节点进栈         x = x->lc; //深入遍历左子树      } else if ( !StackEmpty() ) {         Pop(S,x); //尚未访问的最低祖先节点退栈         visit ( x->data ); //访问该祖先节点         x = x->rc; //遍历祖先的右子树      } else         break; //遍历完成}

后续遍历

这里写代码片
原创粉丝点击