题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
分析
暴力求解法:根据父结点指针找到根结点,进行中序遍历找到下一个结点即可,时间复杂度O(n)。
根据几种情况下的分析,时间复杂度可优化到O(L),L为该结点与后继结点在树中的实际距离。
1)如果该结点有右孩子,则找到右孩子的最左叶子结点返回;
2)如果该结点是父结点的左孩子,则将父结点返回;
3)如果该结点是父结点的右孩子,则继续向上查找(循环1~3),直到父结点为空,表示该结点没有后继结点。
代码
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 tmp = pNode.right;
while(tmp.left!=null) tmp=tmp.left;
return tmp;
}
while(pNode.next!=null){
if(pNode==pNode.next.left) return pNode.next;
pNode=pNode.next;
}
return null;
}
}