zoukankan      html  css  js  c++  java
  • Inorder Successor in BST 解答

    Question

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

    Note: If the given node has no in-order successor in the tree, return null.

    Solution -- Iterative

    Inorder result is an ascending array for BST. Thus, this problem can be transferred to find successor for a node in BST.

    successor = first element that is greater than target node.

    Consider two situations:

    1. Target node has right child

    2. Target node doesn't have right child

    Trace back, find first node whose left child is in the path from target node to root.

    For this situation:

      1. If node has parent pointer, we just use parent pointer.

      2. If node doesn't have parent pointer, we use stack.

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution {
    11     public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
    12         // Same question with finding successor in a BST
    13         // 1. If p has right child, find minimum child in right subtree
    14         // 2. If p doesn't have right child, find first ancestor whose left child is in the path from p to root.
    15         TreeNode result = null;
    16         if (p.right != null) {
    17             result = p.right;
    18             while (result.left != null) {
    19                 result = result.left;
    20             }
    21         } else {
    22             Deque<TreeNode> stack = new LinkedList<TreeNode>();
    23             TreeNode current = root;
    24             // push to stack
    25             while (current != p && current != null) {
    26                 stack.push(current);
    27                 if (p.val < current.val) {
    28                     current = current.left;
    29                 } else {
    30                     current = current.right;
    31                 }
    32             }
    33             // pop stack
    34             TreeNode prev = p;
    35             while (!stack.isEmpty()) {
    36                 TreeNode cur = stack.pop();
    37                 if (cur.left == prev) {
    38                     result = cur;
    39                     break;
    40                 }
    41                 prev = cur;
    42             }
    43         }
    44         return result;
    45     }
    46 }

    Solution 2 -- Recursive

    Find Successor & Predecessor in BST

  • 相关阅读:
    ASP.NET Boilerplate
    Financial.IPmt/Financial.PPmt
    VB内部函数(三)——财务函数
    Convert VB.NET to C#
    MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)
    Oauth2.0客户端服务端示例
    一张图搞定OAuth2.0
    使用JAVA实现的一个简单IOC注入实例
    谈谈对Spring IOC的理解
    秒懂,Java 注解 (Annotation)你可以这样学
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/4946830.html
Copyright © 2011-2022 走看看