• [LeetCode] 510. Inorder Successor in BST II


    Given a node in a binary search tree, find the in-order successor of that node in the BST.

    If that node has no in-order successor, return null.

    The successor of a node is the node with the smallest key greater than node.val.

    You will have direct access to the node but not to the root of the tree. Each node will have a reference to its parent node. Below is the definition for Node:

    class Node {
        public int val;
        public Node left;
        public Node right;
        public Node parent;
    }

    Follow up:

    Could you solve it without looking up any of the node's values?

    Example 1:

    Input: tree = [2,1,3], node = 1
    Output: 2
    Explanation: 1's in-order successor node is 2. Note that both the node and the return 
    value is of Node type.

    Example 2:

    Input: tree = [5,3,6,2,4,null,null,1], node = 6
    Output: null
    Explanation: There is no in-order successor of the current node, so the answer is null.
    

    Example 3:

    Input: tree = [15,6,18,3,7,17,20,2,4,null,13,null,null,null,null,null,null,null,null,9], 
    node = 15 Output: 17

    Example 4:

    Input: tree = [15,6,18,3,7,17,20,2,4,null,13,null,null,null,null,null,null,null,null,9], 
    node = 13 Output: 15

    Example 5:

    Input: tree = [0], node = 0
    Output: null

    Constraints:

    • -10^5 <= Node.val <= 10^5
    • 1 <= Number of Nodes <= 10^4
    • All Nodes will have unique values.

    二叉搜索树中的中序后继 II。

    这道题是285题的延续,但是题设稍微有些变化。这道题给的是一个随机的节点 node,不给你根节点了;给你这个节点 node 的同时,可以允许你访问这个节点的 val,左孩子,右孩子和父亲节点。依然是请你返回这个节点的中序后继。

    思路分两部分,如果这个节点自己有右子树怎么办,和如果这个节点没有右子树怎么办。第一种情况,如果 node 有右子树,那么要找的节点是其右子树里面最小的左孩子

    第二种情况,如果 node 没有右子树,那么要找的中序后继基本上就是在找这个节点的某个父亲节点。但是这里面又分两种子情况,一种是如果我是一个左子树,我要找的很显然是我的最直接的父亲节点,比如例子4里面的2,我找的应该是3,3就是2的父亲节点。还有一种情况是比如我是4(例子2),我是左子树的最右孩子,我的中序遍历的后继节点是根节点5,我不光要试图往父亲节点跑,同时我还需要判断,我每往上走一步的时候,我到达的这个节点的右孩子到底是不是我自己,否则就会和第一种子情况一样,没法区分开了。

    时间O(n)

    空间O(1)

    Java实现

     1 class Solution {
     2     public Node inorderSuccessor(Node node) {
     3         // corner case
     4         if (node == null) {
     5             return null;
     6         }
     7         // if right tree is not empty
     8         // find the most left node on this right tree
     9         if (node.right != null) {
    10             Node suc = node.right;
    11             while (suc.left != null) {
    12                 suc = suc.left;
    13             }
    14             return suc;
    15         }
    16 
    17         // if right tree is empty
    18         while (node.parent != null && node.parent.right == node) {
    19             node = node.parent;
    20         }
    21         return node.parent;
    22     }
    23 }

    相关题目

    285. Inorder Successor in BST

    510. Inorder Successor in BST II

    LeetCode 题目总结

  • 相关阅读:
    任何优秀的程序员, 都有早逝的风险
    租车App第一次迭代报告
    快租车app——需求分析心得
    结对编程——自动生成数学试卷的系统(javaswing,mysql)by 陈松&刘宇航
    结队编程之——阅读分析队友的代码(C++自动生成数学试卷)
    自动生成不同难度的数学试卷系统,并输出到txt文件中,命名为当前时间(java)
    代码之美——浅谈命名规则与代码优化
    关于防抖和节流
    关于sessionStorage和localstorage的一些记录
    vue应用微信二维码登录的一些记录
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13657279.html
Copyright © 2020-2023  润新知