题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
分析
暴力求解法:根据父结点指针找到根结点,进行中序遍历找到下一个结点即可,时间复杂度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;
}
}
本文介绍了一种高效算法,用于在给定二叉树及其某个节点的情况下,寻找该节点在中序遍历下的下一个节点。通过三种情况的分析,包括右子树存在、当前节点为父节点的左子节点以及当前节点为父节点的右子节点,算法的时间复杂度优化至O(L),L为两节点间的实际距离。

被折叠的 条评论
为什么被折叠?



