遍历二叉树: 指按某条搜索路径巡防树中每个结点,使得每个结点都被访问一次且仅为一次;
三种遍历情况:
- 先序遍历二叉树:DLR(先访问根结点,然后访问左子树,最后访问右子树);
递归算法
void inordertraverse(BiTree T)
{ //先序遍历二叉树T的递归算法
if(T) //若二叉树非空
{
cout<<T->data; //先访问根节点
inordertraverse(T->lchild); //在访问左子树
inordertraverse(T->rchild);
}
}
非递归算法
-
初始化一个空栈S,指针p指向根结点
-
申请一个结点空间q,用来存放栈顶弹出的元素;
-
当p非空或者栈S非空时,循环执行以下操作:
-
[? ] 如果p非空,则将p进栈,p指向该节点的根节点
-
[?] 如果p为空,则弹出栈顶元素并访问,将p指向该结点的右孩子;
void inordertraverse(BiTree T)
{
initstack(s); p=T;
q= new BiTNoede;
while(p||!StackEmpty(S))
{
if(p) //p非空
{
Push(S,p); //根指针进栈
cout<<p->data;//根指针进栈,访问根结点;
}
else //p为空
{
Pop(S,q); //退栈
p=q->lchild; //遍历左子树
p=q->rchild; //遍历右子树
}
}
}
- 中序遍历二叉树:LDR(先访问左子树,在访问根结点,最后访问右子树);
递归算法:
void inordertraverse(BITree T)
{ //中序遍历二叉树T 的递归算法
if(T) //判断是否为空
{
inordertraverse(T->lchild);
cout<<T->data;
inoredertraverse(T->rchild);
}
}
非递归算法:
void inordertraverse(BiTree T)
{ //中序遍历二叉树T的非递归算法
initStack(S); p=T;
q=new BiTNode;
while (p|| !StackEmpty(S))
{
if(p)
{
Push(S,p); //根指针进栈
p=p->lchild; //根指针进栈,遍历左子树
}
else
{
Pop(S,q); //退栈
cout<<q->data; //访问根结点
p=q->rchild; //遍历右子树
}
}
}
- 后序遍历二叉树:LRD(先访问左子树,在访问右子树,最后访问根节点)
void inordertraverse(BiTree T)
{ //后序遍历二叉树
if(T)
{
inordertraverse(T->lchild);
inordertraverse(T-.rchild);
cout<<T->data;
}
}