题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:
首先这道题给出的是中序遍历这个二叉树,那么就是左根右。我们在求一个结点的下一个结点,那么这个时候我们需要分情况讨论:
1、如果该结点有右子树,则该结点的下一个结点为该结点的右子树的最左结点。
2、如果该结点没有右子树,则又分两种情况讨论:
情况一:如果该结点为该结点的父结点的左孩子,则该结点的父结点pNode.next则为下一个结点。
情况二:如果该结点为该结点的父结点的右孩子,则该结点的父结点的父结点的父结点,直到其中的一个父结点是这个父结点的左孩子,则该父结点的父结点为下一个结点。
注意:判断语句中,只要包含pNode.next一定要在前面加上“pNode.next ! = null”否则会有空指针报错。
具体java代码如下:
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode){
if(pNode==null){return null;}
if(pNode.next==null&&pNode.left==null&&pNode.right==null){return null;}
if(pNode.right!=null){
pNode=pNode.right;
while(pNode.left!=null){
pNode=pNode.left;
}
return pNode;
}
else{
if(pNode.next!=null&&pNode.next.left==pNode){
return pNode.next;
}
else if(pNode.next!=null&&pNode.next.right==pNode){
while(pNode.next!=null&&pNode.next.left!=pNode){
pNode=pNode.next;
}
if(pNode.next!=null&&pNode.next.left==pNode){
return pNode.next;
}
else{
return null;
}
}
}
return null;
}
}