一般我们讨论的二叉树的结点结构只有:结点值、左儿子、右儿子。
但是如果在结点结构中加一个成员属性,指向结点的父节点。那么又会引出不少的变化。
一:前继结点与后继结点
与链表不同,链表的前继后继就是根据结点在链表中的位置的前一结点、后一结点得出的。但是树不同,结点的上一层与下一层都含有较多的结点,所以不能单纯地由上下层关系定义前继结点与后继结点。
我们说的二叉树结点的前继结点、后继结点是:在中序遍历这棵二叉树的结果中,该结点的前一结点是它的前继结点、后一结点是后继结点。
二:给出某一结点node,求node的后继结点(该树的结点包含父节点指针)【注:该题没有给出树的root结点】
传统解法:由node的父节点不断往上,找到root结点,然后从root开始中序遍历树得到中序遍历结果,则中序遍历结果中node的后面一个结点就是后继结点。
优化解法:从中序遍历的特性去寻找:左-根-右
中序遍历一个结点时,下一个结点有三种情况:1:如果当前结点有右结点,则下一个遍历的是右子树的最左结点;
2:如果当前结点无右结点,若它是父节点的左儿子,则下一遍历的是父节点;
3:如果当前结点无右结点,且它是父节点的右儿子,则所在子树遍历完了。向上寻找一个作为左儿子的祖先结点,那么下一遍历的就是该祖先结点的父节点;(一直找到根节点为止)
如果上面三种情况都没找到,则该节点是树的最后一个结点,无后继结点。