2 Sum in Binary Search Tree

Given a BST, find 2 nodes in it which sum to a given target

hint: 

Inorder traversal + BST + 2 SUM

 * Time : O(N)

 * Space: O(lgN)

 

  1 class TreeNode0 {
  2     int val;
  3     TreeNode0 left, right;
  4     public TreeNode0(int val) {
  5         this.val = val;
  6     }
  7 }
  8 public class BST2sum {
  9     public void bst2sum(TreeNode0 root, int target) {
 10         TreeNode0 left = root, right = root;
 11         TreeNode0 curl = root, curr = root;
 12         Stack<TreeNode0> stack0 = new Stack<TreeNode0>();
 13         Stack<TreeNode0> stack1 = new Stack<TreeNode0>();
 14         /*
 15          * Init, find the most-left and most-right node
 16          */
 17         while (curl != null || !stack0.isEmpty()) {
 18             if (curl != null) {
 19                 stack0.push(curl);
 20                 curl = curl.left;
 21             } else {
 22                 curl = stack0.pop();
 23                 left = curl;
 24                 curl = curl.right;
 25                 break;
 26             }
 27         }
 28         while (curr != null || !stack1.isEmpty()) {
 29             if (curr != null) {
 30                 stack1.push(curr);
 31                 curr = curr.right;
 32             } else {
 33                 curr = stack1.pop();
 34                 right = curr;
 35                 curr = curr.left;
 36                 break;
 37             }
 38         }
 39         while (right.val >= left.val) {
 40             System.out.println("left: "+left.val + ", right: "+right.val);
 41             if (left.val + right.val == target) {
 42                 System.out.println(left.val + ", " + right.val);
 43                 return;
 44             } else if (left.val + right.val < target) { // move left
 45                 while (curl != null || !stack0.isEmpty()) {
 46                     if (curl != null) {
 47                         stack0.push(curl);
 48                         curl = curl.left;
 49                     } else {
 50                         curl = stack0.pop();
 51                         left = curl;
 52                         curl = curl.right;
 53                         break;
 54                     }
 55                 }
 56             } else if (left.val + right.val > target) { // move right
 57                 while (curr != null || !stack1.isEmpty()) {
 58                     if (curr != null) {
 59                         stack1.push(curr);
 60                         curr = curr.right;
 61                     } else {
 62                         curr = stack1.pop();
 63                         right = curr;
 64                         curr = curr.left;
 65                         break;
 66                     }
 67                 }
 68             }
 69         }
 70         System.out.println("the target has not been found");
 71     }
 72     public static void main(String[] args) {
 73         TreeNode0 node0 = new TreeNode0(0);
 74         TreeNode0 node1 = new TreeNode0(3);
 75         TreeNode0 node2 = new TreeNode0(5);
 76         TreeNode0 node3 = new TreeNode0(6);
 77         TreeNode0 node4 = new TreeNode0(7);
 78         TreeNode0 node5 = new TreeNode0(9);
 79         TreeNode0 node6 = new TreeNode0(13);
 80         TreeNode0 node7 = new TreeNode0(17);
 81         TreeNode0 node8 = new TreeNode0(22);
 82         TreeNode0 node9 = new TreeNode0(23);
 83         node4.left = node2;
 84         node4.right = node6;
 85         node6.left = node5;
 86         node6.right = node8;
 87         node8.left = node7;
 88         node8.right = node9;
 89         node2.left = node0;
 90         node2.right = node3;
 91         node0.right = node1;
 92         BST2sum tree = new BST2sum();
 93         tree.bst2sum(node4, 11);
 94         tree.bst2sum(node4, 15);
 95         tree.bst2sum(node4, 18);
 96         tree.bst2sum(node4, 30);
 97     }
 98 }
 99 /*
100             7
101         /       \
102        5         13
103      /   \      /   \
104     0     6    9    22
105      \             /  \
106        3           17  23
107 */

 

posted @ 2015-05-20 12:01  Joyce-Lee  阅读(327)  评论(0编辑  收藏  举报