題目描述
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。
思路:分析每種情況
1.有右子樹,下一節點是右子樹的最左結點
2.沒有右子樹,且該結點是父結點的左孩子,下一結點是該結點的父結點
3.沒有右子樹,且該結點是父結點的右孩子,那麼沿着父結點追溯,直到某個結點是其父結點的左孩子,下個結點就是這個結點的父結點
4.沒有右子樹,也沒有父結點,就返回null
/*
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)
{
TreeLinkNode p=pNode;
//1.有右子樹,下一節點是右子樹的最左結點
if(pNode.right!=null){
p=pNode.right;
while(p.left!=null){
p=p.left;
}
return p;
}
//2.沒有右子樹,且該結點是父結點的左孩子,下一結點是該結點的父結點
else if(pNode.next!=null&&pNode.next.left==pNode){
return pNode.next;
}
//3.沒有右子樹,且該結點是父結點的右孩子,
//那麼沿着父結點追溯,直到某個結點是其父結點的左孩子,返回這個結點的父結點
else if(pNode.next!=null&&pNode.next.right==pNode){
p=pNode.next;
while(p.next!=null&&p.next.right==p){
p=p.next;
}
return p.next;
}
return null;
}
}
寫完之後可以發現23情況是可以合併的,在無右子樹的情況下,也就是隻能追溯父結點時,下一個結點就是某個結點的父結點,該結點是其父結點的左孩子
/*
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)
{
TreeLinkNode p=pNode;
//1.有右子樹,下一節點是右子樹的最左結點
if(pNode.right!=null){
p=pNode.right;
while(p.left!=null){
p=p.left;
}
return p;
}
//2.有父結點,追溯,直到某個結點是其父結點的左孩子,下一節點就是該結點的父結點
else if(pNode.next!=null){
p=pNode;
while(p.next!=null&&p!=p.next.left){
p=p.next;
}
return p.next;
}
return null;
}
}