• 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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    通过Native Memory Tracking查JVM的线程内存使用(线上JVM排障之九)
    [SQL开发笔记]IN操作符: 在WHERE子句中规定多个值
    在前端设计中,子元素的基线和父元素的基线分别是什么意思?并利用Bootstrap的类align-items-baseline实现子元素在其父容器内基线对齐。
    git submodule使用
    20230909java面经整理
    软件开发项目 质量管理的6大关键事项
    微信小程序开发工具介绍及安装(上)
    CoM-Px30|RK3358开发初步连载-Andorid系统固件的烧写(三)
    redis(封装jedis)-----面试
    杀掉redis进程 并启动redis
  • 原文地址:https://blog.csdn.net/qq_45703684/article/details/126020558