Leetcode 285: Inorder Successor in BST

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.

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     public int val;
 5  *     public TreeNode left;
 6  *     public TreeNode right;
 7  *     public TreeNode(int x) { val = x; }
 8  * }
 9  */
10 public class Solution {
11     public TreeNode InorderSuccessor(TreeNode root, TreeNode p) {
12         if (root == null || p == null) return null;
13         
14         var stack = new Stack<TreeNode>();
15         
16         TreeNode node = root, successor = null;
17         while (node != null || stack.Count > 0)
18         {
19             if (node != null)
20             {
21                 stack.Push(node);
22                 node = node.right;
23             }
24             else
25             {            
26                 node = stack.Pop();
27                 if (node == p || node.val < p.val) return successor;
28                 successor = node;
29                 node = node.left;
30             }
31         }
32         
33         return null;
34     }    
35 }
36 
37 public class Solution1 {
38     public TreeNode InorderSuccessor(TreeNode root, TreeNode p) {
39         if (root == null || p == null) return null;
40         
41         return Inorder(root, p, null);
42     }
43     
44     private TreeNode Inorder(TreeNode node, TreeNode p, TreeNode successor)
45     {
46         if (node == null) return successor;
47         
48         var s = Inorder(node.right, p, successor);
49         
50         if (node == p || node.val < p.val) return s;
51         
52         return Inorder(node.left, p, node);
53     }
54 }
55 
56 // dfs way 2, I prefer this
57 public class Solution2 {
58     public TreeNode InorderSuccessor(TreeNode root, TreeNode p) {
59         if (root == null || p == null) return null;
60         
61         var successor = new TreeNode[1];
62         
63         Inorder(root, p, successor);
64         
65         return successor[0];
66     }
67     
68     private void Inorder(TreeNode node, TreeNode p, TreeNode[] successor)
69     {
70         if (node == null) return;
71         
72         Inorder(node.right, p, successor);
73         
74         if (node == p || node.val < p.val) return;
75         successor[0] = node;
76         
77         Inorder(node.left, p, successor);
78     }
79 }

 

posted @ 2017-12-20 05:36  逸朵  阅读(164)  评论(0)    收藏  举报