[例]遍历二叉树额应用:输出二叉树中的叶子结点。
- 在二叉树的遍历算法中增加检测结点的“左右子树是否都为空”
void PreOrderPrintLeaves(BinTree BT)
{
if (BT)
{
if (!BT->left && !BT->right)
printf("%d",BT->Data);
PreOrderPrintLeaves(BT);
PreOrderPrintLeaves(BT);
}
[例]求二叉树的高度
- Height=max(HL,HR)+1
int PostOrderGetHeight(BinTree BT)
{
int HL,HR,MAXH;
if (BT)
{
HL=PostOrderGetHeight(BT->Left);
HR=PostOrderGetHeight(BT->right);
MAXH=(HL>HR)?HL:HR;
return (MAXH+1);
}
else return 0;
}
[例]二元运算表达式树及其遍历
- 叶结点是运算数
- 其余结点均为运算符
- 三种遍历可以得到三种不同的访问结果
- 先序遍历得到前缀表达式:++a*bc*+*defg
- 中序遍历得到中缀表达式:a+b*c+d*e+f*g
- 后续遍历得到后缀表达式:abc*+de*+fg*+
[例]由两种遍历序列确定二叉树
已知三种遍历中的任意两种遍历序列,能否唯一确定一棵二叉树呢?
- 答案是:必须要有中序遍历才行!
- 没有中序的困扰:
- 先序遍历序列:A B
- 后序遍历序列:B A
- 先序和中序遍历序列来确定一棵二叉树
【分析】
- 根据先序遍历序列第一个结点确定根结点
- 根据根结点在中序遍历序列中分割在左右两个子序列
- 对左子树和右子树分别分别递归使用相同的方法继续分解