方法一:通过不停的使用next指针找到这棵树的根节点。然后利用中序遍历,将遍历结果放入一个ArrayList,然后找到这个pNode的位置,即可返回下一个结点
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
TreeLinkNode p=pNode;
while(p.next!=null){
p=p.next;
}
ArrayList<TreeLinkNode> list=new ArrayList<TreeLinkNode>();
setlist(p,list);
for(int i=0;i<list.size()-1;i++){
if(list.get(i)==pNode){
return list.get(i+1);
}
}
return null;
}
public void setlist(TreeLinkNode p,ArrayList<TreeLinkNode> list){
if(p==null){
return;
}
setlist(p.left,list);
list.add(p);
setlist(p.right,list);
}
}
方法二:
情况一:如果pNode有右子树,那么右子树的最左边结点就是pNode的后继结点。
情况二:如果pNode没有右子树,先看看pNode是不是父结点,如果是就返回null。
如果pNode是其父结点的左孩子,那么就返回pNode的父结点。如果pNode是父结点的右孩子,那么就向上寻找pNode的后继结点,定义s为pNode的父结点,p为s的后继结点,当发现s为p的左孩子的时候就返回p,否则一直移动。
情况三:如果s和p一直往上移动,到了p都变成了空结点,说明pNode没有后继结点,返回null即可。
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
if(pNode.right!=null){
TreeLinkNode temp=pNode.right;
while(temp.left!=null){
temp=temp.left;
}
return temp;
}
else{
if(pNode.next==null)
return null;
TreeLinkNode s=pNode.next;
if(pNode==s.left){
return s;
}else{
while(s!=null){
if(s.next==null){
return null;
}
TreeLinkNode p=s.next;
if(s==p.left){
return p;
}
s=s.next;
}
}
}
return null;
}
}