Leetcode 刷题日记 剑指 Offer II 053. 二叉搜索树中的中序后继

原题链接(https://leetcode.cn/problems/P5rCT8)

题目描述

给定一棵二叉搜索树和其中的一个节点 p ,找到该节点在树中的中序后继。如果节点没有中序后继,请返回 null 。节点 p 的后继是值比 p.val 大的节点中键值最小的节点,即按中序遍历的顺序节点 p 的下一个节点。

示例1

示例1

输入:root = [2,1,3], p = 1
输出:2

示例2

示例2

输入:root = [5,3,6,2,4,null,null,1], p = 6
输出:nul

数据约束

  • p为树的节点
  • 数中节点的数目范围是[1,10^4]
  • -10^5 <= Node.val <= 10^5
  • 树中各节点的值均保证唯一。

思路

二叉搜索树是一种特殊的二叉树,对于一个节点,它的值一定大于其左子树的任何一个值,它的右子树的任何一个值都要大于它,几左子树<父节点<右子树。利用这个特性再查找二叉树的时候并不需去扫描每一个节点,既然题目要找最小的大于它的那么就是能走左子树就必须走左子树,走到右子树之后也需要去核验左子树否则就是右子树。如果右子树找到底都没有符合的那就没有任何一个数据符合了。同时因为需要匹配是一个树节点,那么如果这个节点有右子树那么一定是从那个右子树开始向左子树走得到的节点,不然才需要从根节点走。
例2的访问流程应该是
首先p没有右子树所有从头开始
1

由于根节点的值小于6所以应该走右子树
2

最后得到null
假设将例2的p改为3这个节点那结果就不一样了

首先,3是有右子树的所以可以走右子树
3

然后右子树没有左子树所以得到4
假设有一个二叉搜索树如图
4
假设P为50
首先p没有右子树所以需要从根节点开始。
首先根节点的值小于50所以需要向右子树走,既走到65节点上
5
65大于50所以需要向左走,但是左子树的值是50不大于50所以左子树也走到了头,因此得到了结果65
6

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        TreeNode ans = null;
		if (p.right != null) {
			ans = p.right;
			while (ans.left != null) {
				ans = ans.left;
			}
		}
		while (root != null) {
			if (root.val > p.val) {
				ans = root;
				root = root.left;
			} else {
				root = root.right;
			}
		}
		return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值