码迷,mamicode.com
首页 > 其他好文 > 详细

Inorder Successor in BST 解答

时间:2015-11-08 14:26:04      阅读:332      评论:0      收藏:0      [点我收藏+]

标签:

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

 

Inorder Successor in BST 解答

标签:

原文地址:http://www.cnblogs.com/ireneyanglan/p/4946830.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!