后来发现,这个认识是不正确的。对于顺序结构的节点来说(线性结构)节点的前趋和后继节点很直接就找到了。而二叉树是非线性结构的,所以,说二叉树的前趋和后继的前提必须是以二叉树的线索化为前提的。而二叉树的线索化,跟二叉树的遍历方式是密切相关的。所以,在某种遍历方式形成的二叉树的线性结构线索下,再去讨论某个结点的前趋和后继才是有意义的。
现在以一个非单一结点的树作为讨论参照看看三种典型遍历方式的线索化中,某个结点B(非根节点,其父节点为A)的前趋和后继:
1.前序遍历
前趋:
(1)如果B是其父节点A的左树的根节点,那么A的前趋就是父节点
(2)如果B是其父节点A的右树的根节点且A没有左子树,那么B的前趋就是其父节点A
(3)如果B是其父节点A的右树的根节点且A具有左子树(做孩子节点C),那么A的前趋就是从C节点开始一直顺着右孩子指针直到叶子节点那一层,如果此时右叶子节点不存在,则A的前趋节点是左叶子节点,否则,A的前趋节点就是右叶子节点。
后继:
(1)如果B节点有左孩子节点,那么B节点的后继就是这个左节点
(2)如果B节点没有左孩子节点而拥有右孩子节点,那么B点的后继就是右孩子节点
(3)如果B节点为叶子节点,且B为A的左树根节点,且父节点A有右树根节点C,那么B的后继就是C
2.中序遍历
前趋:
(1)如果B有左孩子节点C,从C节点开始,一直沿右孩子的指针达到的叶子节点D,那么D就是B的前趋(若C为叶子节点,则C就是B的前趋)
(2)如果B是A的右树根节点,且B没有左孩子节点,那么A就是B的前趋
后继:
(1)如果B有右孩子节点C,从C节点开始,沿着左孩子指针到达叶子节点D,那么D就是B的后继(如果C为叶子节点或者C没有左孩子节点,那么C就是B的后继节点)
(2)如果B是A的左树根节点,且B没有右孩子节点,那么B的后继节点就是A
(3)如果B是A的右树根节点,且B没有右孩子节点,那么B就没有后继节点
以上是对两种线索化中的前趋和后继的分析和举例,也许还有个别的遗漏和条件的不严谨,但主要就是来辅助说明前趋和后继这两个概念。
关于“后序遍历”的前趋和后继节点就不在这里举例说明了,大家有兴趣可以自己去总结总结吧。
其实,如果要找前趋和后继节点,最直观的方法还是将二叉树进行线索化,然后,做线性存储,这样,在这个存储结构中就比较直接和便捷的找到某个节点的前趋和后继了。
现在以一个非单一结点的树作为讨论参照看看三种典型遍历方式的线索化中,某个结点B(非根节点,其父节点为A)的前趋和后继:
1.前序遍历
前趋:
(1)如果B是其父节点A的左树的根节点,那么A的前趋就是父节点
(2)如果B是其父节点A的右树的根节点且A没有左子树,那么B的前趋就是其父节点A
(3)如果B是其父节点A的右树的根节点且A具有左子树(做孩子节点C),那么A的前趋就是从C节点开始一直顺着右孩子指针直到叶子节点那一层,如果此时右叶子节点不存在,则A的前趋节点是左叶子节点,否则,A的前趋节点就是右叶子节点。
后继:
(1)如果B节点有左孩子节点,那么B节点的后继就是这个左节点
(2)如果B节点没有左孩子节点而拥有右孩子节点,那么B点的后继就是右孩子节点
(3)如果B节点为叶子节点,且B为A的左树根节点,且父节点A有右树根节点C,那么B的后继就是C
2.中序遍历
前趋:
(1)如果B有左孩子节点C,从C节点开始,一直沿右孩子的指针达到的叶子节点D,那么D就是B的前趋(若C为叶子节点,则C就是B的前趋)
(2)如果B是A的右树根节点,且B没有左孩子节点,那么A就是B的前趋
后继:
(1)如果B有右孩子节点C,从C节点开始,沿着左孩子指针到达叶子节点D,那么D就是B的后继(如果C为叶子节点或者C没有左孩子节点,那么C就是B的后继节点)
(2)如果B是A的左树根节点,且B没有右孩子节点,那么B的后继节点就是A
(3)如果B是A的右树根节点,且B没有右孩子节点,那么B就没有后继节点
以上是对两种线索化中的前趋和后继的分析和举例,也许还有个别的遗漏和条件的不严谨,但主要就是来辅助说明前趋和后继这两个概念。
关于“后序遍历”的前趋和后继节点就不在这里举例说明了,大家有兴趣可以自己去总结总结吧。
其实,如果要找前趋和后继节点,最直观的方法还是将二叉树进行线索化,然后,做线性存储,这样,在这个存储结构中就比较直接和便捷的找到某个节点的前趋和后继了。