</0%"根结点入队列
while !61% #
%</60同层元素数加
if!'$%&#</0%'左子女入队
if!'$%&#</0%'右子女入队
if!6' #一层结束,
%
if!'5F#5F% 指向下层最右元素更新当前最大宽度
%-
if
while
return!5F#
结束 F
★★后序遍历算法★★
*3,二叉树结点 所对应子树的第一个后序遍历结点 C 的求法如下:若 有左子树,则 C 是 的左子树上
最左下的叶子结点;若 无左子树,仅有右子树,则 C 是 的右子树上最左下的叶子结点。
Q !#
C%
if!$C#return!&#
else
while!C'EEC'#找最左下的叶子结点
if!C'#C%C'优先沿左分枝向下去查“最左下”的叶子结点
elseC%C'沿右分枝去查“最左下”的叶子结点
return!C#
/算法讨论0题目“求 所对应子树的第一个后序遍历结点”,蕴涵 是子树的根。若 是叶子结点,求其后
继要通过双亲。
L,后序遍历最后访问根结点,当访问到值为 5 的结点时,栈中所有元素均为该结点的祖先。
voidI!"5#在二叉树 " 中,查找值为 x 的结点,并打印其所有祖先
typedefstruct
int ;
R;%- 表示左子女被访问,;% 表示右子女被访问
R /0栈容量足够大
%-
while !"$%&EE'-#
Gwhile !"$%&22"'$%5# 结点入栈
/0,%" /0,;%-"%"'沿左分枝向下
Gif !"'%%5# 6!7所查结点的所有祖先结点的值为)S9#找到 5
for!%1%#6! /0,'#return输出祖先值后结束
Gwhile !$%-22 /0,;%%# 退栈(空遍历)
Gif !$%-# /0,;%"% /0,'沿右分枝向下遍历
while!"$%&EE'-#
结束
因为查找的过程就是后序遍历的过程,使用的栈的深度不超过树的深度,算法复杂度为 >!;#。
T,后序遍历最后访问根结点,即在递归算法中,根是压在栈底的。采用后序非递归算法,栈中存放二叉
树结点的指针,当访问到某结点时,栈中所有元素均为该结点的祖先。本题要找 和 C的最近共同祖先
结点 不失一般性,设 在 C 的左边。后序遍历必然先遍历到结点 ,栈中元素均为 的祖先。将栈拷
入另一辅助栈中。再继续遍历到结点 C 时,将栈中元素从栈顶开始逐个到辅助栈中去匹配,第一个匹配
(即相等)的元素就是结点 和 C 的最近公共祖先。
typedefstruct
int ;;%-表示结点的左子女已被访问,;% 表示结点的右子女已被访问
R
R /0 /0栈,容量够大
BiTree Ancestor!M>>C#求二叉树上结点 p 和 q 的最近的共同祖先结点 。
%-"%M>>
while !"$%&EE'-#
while !"$%&22"$%22"$%C# 结点入栈
/0,%" /0,;%-"%"'沿左分枝向下
if !"%%# 不失一般性,假定 在 C 的左侧遇结点 时,栈中元素均为 的祖先结点
for!%1%# /0% /0%将栈 的元素转入辅助栈