题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
分析:
- 如果结点p有右子树,则中序遍历下一个结点就是它右子树的最左子节点;
- 如果结点p没有右子树,分为两种情况:
- 结点p是其父结点的左子树,返回p的父结点即可。
- 结点p是其父结点的右子树,则沿着父结点往上遍历直到找到一个是它父结点的左子节点,返回这个父结点。
代码如下:
package Solution45;
//给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
//注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
public class Solution {
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
public TreeLinkNode GetNext(TreeLinkNode pNode) {
if(pNode==null) return null;
TreeLinkNode pNext=null;
if(pNode.right!=null){ //右子树不为空
TreeLinkNode pRight=pNode.right;
while(pRight.left!=null){
pRight=pRight.left;
}
pNext=pRight;
}else if(pNode.next!=null){ //父结点不为空
TreeLinkNode parent=pNode.next;
if(parent.left==pNode){
pNext=parent;
}else{
while(parent.next!=null &&parent.next.left!=parent )
parent=parent.next;
pNext=parent.next;
}
}
return pNext;
}
}