一、题目
给定一个二叉树和其中的一个节点,请找出中序遍历顺序的下一个节点并且返回。注意,树中的节点不仅包含左右子节点,同时包含指向父节点的指针。
二、思路
首先我们知道中序遍历的顺序是:左子树------根节点------右子树。下图的这棵树的中序遍历序列是 {d,b,h,e,i,a,f,c,g},我们以这棵树来分析二叉树的下一个节点。
(1)如果一个节点有右孩子,则其右孩子的左叶子节点就是该节点中序遍历的下一个节点。例如,图中节点 b 的下一个节点是 h,节点 a 的下一个节点是 f。
(2)如果一个节点没有右孩子,并且该节点是其父节点的左孩子,那么该节点的下一个节点就是它的父节点。例如,图中节点 d 的下一个节点是节点 b,节点 f 的下一个节点是节点 c。
(3)如果一个节点既没有右孩子,并且还是它父节点的右孩子,这也是最复杂的一种情况。我们沿着其父节点一直向上搜索,直到找到一个是它父节点的左孩子的节点,如果这样的节点存在,那么这个节点的父节点就是我们要找的下一个节点。例如,图中的节点 i,没有右孩子且是它的父节点的右孩子。沿着它的父节点向上搜索,找到节点 b,节点 b 是它的父节点的左孩子,所以节点 b 的父节点就是节点 i 的下一个节点。
三、代码
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode){
// 空树
if(pNode == null)
return null;
// 该节点有右孩子
if(pNode.right != null){
pNode = pNode.right;
// 找右孩子的左叶子节点
while(pNode.left != null){
pNode = pNode.left;
}
return pNode;
}
// 没有右孩子,向上判断父节点
while(pNode.next != null){
// 该节点是其父节点的左孩子,父节点就是中序的下一个节点
if(pNode.next.left == pNode){
return pNode.next;
}
pNode = pNode.next;
}
return null;
}
}