题目
描述
给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示
思路
首先我们的思路一定是遍历然后直接搞出来,而且他的时间复杂度也满足要求,但是这里我们有parent指针,可以有更技巧的方法。
对于选定节点他作为根节点的子树肯定是左中右顺序遍历的
那么如果他的右节点存在,他的下一个就应该是右子树的第一个节点
也就是右节点的最左节点
如果没有右节点那么本节点一定是在子树之中的最后一个
注意下面非常容易出错
如果本节点是父节点的右节点,呢么它应该是父节点作为子树的根节点的树的最后一个,但是如果爷爷节点的左节点是父节点,那么爷爷节点就是给定节点 的下一个节点,所以这里也应该有一个while循环
代码
/*
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 cur=pNode.right;
while(cur.left!=null){
cur=cur.left;
}
return cur;
}
else{
//判断父亲
if(pNode.next==null)return null;
else{
while(pNode.next!=null&&pNode.next.right==pNode){
pNode=pNode.next;
}
return pNode.next;
}
}
}
}