题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
public static class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
TreeLinkNode GetNext(TreeLinkNode pNode){
if(pNode==null) return null;
if(pNode.next==null){//如果是根节点,查找右子树的最左节点(如果存在)
if(pNode.right==null) return null;
pNode = pNode.right;
while(pNode.left!=null) pNode=pNode.left;
return pNode;
}else if(pNode.next.left==pNode){//如果是父节点的左节点,当其右节点不存在时,返回父节点;否则返回右子树最左节点
if(pNode.right==null) return pNode.next;
pNode = pNode.right;
while(pNode.left!=null) pNode=pNode.left;
return pNode;
}else if(pNode.next.right==pNode){//如果是父节点的右节点,当其右节点存在,返回右节点;否则返回最非右父节点之父(如果过程循环到根节点,返回空)
if(pNode.right!=null) return pNode.right;
while(pNode.next!=null && pNode.next.right==pNode) pNode=pNode.next;
if(pNode.next==null) return null;
return pNode.next;
}
return null;
}