给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
分析:
首先得知道中序遍历是什么样的。这里分为三种情况,
- 当此节点有右子节点时,下一节点即为右子树的最左边的节点。
- 当此节点没有右子节点且它是它父节点的左子节点时,下一节点即为它的父节点。当然首先得判断是否有父节点。
- 当此节点没有右子节点且它是它父节点的右子节点时,此时说明该节点是某一子树遍历的最后一个节点,若该子树是节点A的左子树,那么下一节点即为A,若该子树是节点A的右子树,那么没有下一节点。具体操作就是向上找到一个节点B,它的父节点A的左子节点是B,那么答案就是A。
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
if (pNode == null) return null;
if (pNode.right != null) {
TreeLinkNode right = pNode.right;
while (right.left != null)
right = right.left;
return right;
} else {
if (pNode.next == null) return null;
if (pNode.next.left == pNode) return pNode.next;
if (pNode.next.right == pNode) {
pNode = pNode.next;
while (pNode.next != null && pNode.next.right == pNode)
pNode = pNode.next;
if (pNode.next == null) return null;
else return pNode.next;
}
}
return null;
}
}