题目:力扣挂了。。蛋疼
题目内容后续再补上Html版的
设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。 如果指定节点没有对应的“下一个”节点,则返回null。 示例 1: 输入: root = [2,1,3], p = 1 2 / \ 1 3 输出: 2 示例 2: 输入: root = [5,3,6,2,4,null,null,1], p = 6 5 / \ 3 6 / \ 2 4 / 1 输出: null Related Topics 树 深度优先搜索 二叉搜索树 二叉树 👍 71 👎 0
题解
按照题意,找的就是二叉树按照中序遍历,排在目标节点后面一位的数字,这个节点可能是目标节点的右子节点,也还有可能是目标节点的父节点(当目标节点作为父节点的左子节点,且没有右子节点的时候)。
所以按照题意,直接DFS写个中序遍历,找到目标节点后,标记下已经找到目标节点,而在遍历下一个节点之前判断下,是否已经找到目标节点,如果已经找到了目标节点,则此时需要遍历的节点便是后继者节点。
class Solution {
private TreeNode current;
private TreeNode follower;
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
midFetch(root,p);
return follower;
}
private void midFetch(TreeNode root , TreeNode p){
if (root==null)return;
if (follower!=null){
return ;
}
midFetch(root.left,p);
if (follower!=null){
return ;
}
if (current!=null && current.val == p.val ){
follower = root;
return ;
}
current = root;
midFetch(root.right,p);
}
}
//leetcode submit region end(Prohibit modification and deletion)
题中左子节点遍历完成之后需要判断下follower!=null,这里一开始没注意,踩了个坑,在官方给出的测试用例中
测试用例:[5,3,6,2,4,null,null,1] 1
如果没有此处的判断,则会跑出错误的答案。按照规则,应当是每遍历一个节点之后都需要判断。
所以左子节点遍历后需要判断一下,root节点遍历的时候需要判断一下,右子节点遍历的时候也需要判断一下,但是因为右子节点已经在方法结尾,所以省去判断。
发表评论