c语言二叉树非递归创建调用case:(,)"abtreenode",2019-04-29 非递归法实现而二叉树的遍历...

/*先序遍历*/

void preorder(BTNode *bt)

{

if(bt!=NULL)

{

BTNode *Stack[maxSize];

int top=-1;

BTNode *p;

Stack[++top]=bt;

while(top!=-1)

{

p=Stack[top--];

if(p->rchild!=NULL)

Stack[++top]=p->rchild;

if(p->lchild!=NULL)

Stack[++top]=p->lchild;

}

}

}

/*中序遍历*/

vooid inorder(BTNode *bt)

{

if(bt!=NULL)

{

BTNode *Stack[maxSize];

int top=-1;

BTNode *p=bt;

while(p!=NULL || top!=-1)

{

while(p!=NULL)

{

Stack[++top]=p;

p=p->lchild;

}

if(top!=-1)

{

p=Stack[top--];

visit(p);

p=p->rchild;

}

}

}

}

/*后序遍历*/

void postorder(BTNode *bt)

{

BTNode *Stack1[maxSize];

BTNode *Stack2[maxSize];

int top1=-1;

int top2=-1;

while(top1!=-1)

{

p=Stack[top1--];

Stack2[++top2]=p;

if(p->lchild!=NULL)

Stack1[++top1]=p->lchild;

if(p->rchild!=NULL)

Stack1[++top2]=p->rchild;

}

while(top2!=-1)

{

p=Stack2[top2--];

visit(p);

}

}

/*

算法的思想:

1.后续遍历都是先访问左右子树,然后访问根结点

2.使用栈来存储结点,需要分清楚是从左子树返回,还是从右子树返回

3.使用r指向最近访问的结点的

*/

void postorder(BiTree T)

{

InitStack(s);

p = T;

r = NULL;

while (p || !IsEmpty(s))

{

if (p)//这里可以使用while循环语句,并不会有什么影响

{

push(s, p);

p = p->lchild;//走到最左边

}

else //向右走

{

GetTop(s, p);

//后序遍历,如果结点p右孩子存在,那么p->rchild是p的前驱

//r记录最近访问的一个结点,如果有右子树,那么一定是在访问完了r->rchild之后访问p

if (p->rchild && p->rchild != r)//如果右子树存在,并且没有访问过

{

p = p->rchild;

push(s, p);

p = p->lchild;

}

else

{

pop(s, p);

visit(p);

r = p; //记录一下刚刚访问的结点

p = NULL;//这里可以使得元素继续出栈

}

}

}

}

//eg.当访问一个结点的时候,栈中的内容恰好是*p结点的所有祖先结点,从栈底结点到栈顶结点再到*p结点

//刚好构成一个从根结点到*p结点的一条路径。很多算法使用这个特性进行求解,比如计算根结点到某一个结点的路径,求两个结点的公共祖先结点都可以这样计算

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值