遍历二叉树和线索二叉树

来源:互联网 发布:淘宝网首页女装毛衣 编辑:程序博客网 时间:2024/05/24 06:29

背景
在二叉树的应用中,常常要求在树中查找具有某种特征的结点,或者是树中的全部结点逐一处理.

遍历二叉树定义
按某条搜索路径寻访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次.

实质
二叉树的线性化的过程,将非线性结构中的树中结点排成一个线性序列

二叉树=根节点+左子树+右子树
用L,D ,R分别表示遍历左子树,访问根结点,遍历右子树可以LDR.DLR,LRD,RDL,DRL,RLD,6种遍历方案.若规定先左后右则有3种分别是先(根)序遍历中(根)序遍历后(根)序遍历

先序遍历二叉树操作定义
1.若二叉树为空,则空操作
2.非空二叉树:
(1)访问根节点
(2)先序遍历左子树
(3)先序遍历右子树
中序遍历和后序遍历以此类推.

二叉树
图中表示下述表达式:
a+b*(c-d)-e/f

若按先序遍历:-+a*b-cd/cf
中序遍历:a+b*c-d-e/f
后序遍历:abcd-*+ef/-
分别对应表达式的前缀(波兰式),中缀表达式,后缀表达式(逆波兰式)

先序遍历的递归算法
void PreorderTravers(BiTree T){

if(T){cout<<T->data;PreorderTraverse(T->lchild);PreorderTraverse(T->rchild);

}
}

只要改变输出语句的顺序(这里的访问只是输出该结点的数据),可类似的实现中序遍历和后序遍历.如果在算法中暂且抹去和递归无关的cout语句,则3个的遍历算法完全相同

先序遍历的非递归算法
设p为一个栈,p为指向根结点的指针
(1)当p为非空时,访问并将p所指向的结点的地址进栈,p指向该结点的左孩子.
(2)当p为空时,弹出栈顶元素,将p指向该结点的有孩子
(3)重复前两步,直到栈空且p也为空.

算法描述
void PreorderTraverse(BiTree T){
InitStack(S);p=T;//初始化栈
q=new BiTNode;
while(p||!StackEmpty(S)){
if(p){
cout<data;
pus(S,p);
p->lchild;}
else{
Pop(S,q);
/中序遍历cout放在这里/
p=q->rchild;}
}
}
同理,中序遍历和后序遍历只是改变输出语句的位置(后续暂时不知道放在哪里)。

时间复杂度O(n),空间复杂度O(n).

还有一种遍历按层次遍历:自上而下,从左到右.

0 0
原创粉丝点击