Advertisement
1988coder

Kth Smallest Element in a BST

Sep 4th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.47 KB | None | 0 0
  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. class Solution {
  11.     public int kthSmallest(TreeNode root, int k) {
  12.         // return kthSmallestInorderIterative(root, k);
  13.         return kthSmallestInorderRecursive(root, k);
  14.         // return kthSmallestCountNodes(root, k);
  15.     }
  16.    
  17.     public int kthSmallestInorderIterative(TreeNode root, int k) {
  18.         if (root == null || k == 0) {
  19.             return -1;
  20.         }
  21.         Stack<TreeNode> stack = new Stack<>();
  22.        
  23.         while (root != null) {
  24.             stack.push(root);
  25.             root = root.left;
  26.         }
  27.        
  28.         while (!stack.isEmpty()) {
  29.             TreeNode node = stack.pop();
  30.             k--;
  31.             if (k == 0) {
  32.                 return node.val;
  33.             }
  34.             node = node.right;
  35.             while (node != null) {
  36.                 stack.push(node);
  37.                 node = node.left;
  38.             }
  39.         }
  40.         return -1;
  41.     }
  42.    
  43.     public int kthSmallestInorderRecursive(TreeNode root, int k) {
  44.         if (root == null || k == 0) {
  45.             return -1;
  46.         }
  47.        
  48.         int[] countAndResult = new int[2];
  49.         countAndResult[0] = k;
  50.         inOrderTraversalHelper(root, countAndResult);
  51.         return countAndResult[1];
  52.     }
  53.    
  54.     private void inOrderTraversalHelper(TreeNode node, int[] countAndResult) {
  55.         if (node == null) {
  56.             return;
  57.         }
  58.         inOrderTraversalHelper(node.left, countAndResult);
  59.         if (countAndResult[0] == 0) {
  60.             return;
  61.         }
  62.         countAndResult[0]--;
  63.         if (countAndResult[0] == 0) {
  64.             countAndResult[1] = node.val;
  65.             return;
  66.         }
  67.         inOrderTraversalHelper(node.right, countAndResult);
  68.     }
  69.    
  70.     public int kthSmallestCountNodes(TreeNode root, int k) {
  71.         int leftSubtreeCount = countNodesInTree(root.left);
  72.         if (k <= leftSubtreeCount) {
  73.             return kthSmallestCountNodes(root.left, k);
  74.         } else if (k > leftSubtreeCount + 1) {
  75.             return kthSmallestCountNodes(root.right, k - leftSubtreeCount - 1);
  76.         }
  77.         return root.val;
  78.     }
  79.    
  80.     private int countNodesInTree(TreeNode node) {
  81.         if (node == null) {
  82.             return 0;
  83.         }
  84.         return 1 + countNodesInTree(node.left) + countNodesInTree(node.right);
  85.     }
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement