leetcode——230——Kth Smallest Element in a BST

Given a binary search tree, write a function kthSmallest to find the kth smallest element in it.

Note:
You may assume k is always valid, 1 ≤ k ≤ BST's total elements.

Follow up:
What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine?


思路一:
   对二叉搜索树中序遍历,第k个数是第K小的元素
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
      int num=0;//记录次数
      int re;//记录最终结果
    int kthSmallest(TreeNode* root, int k) {
         digui(root,k);
         return re;
    }
    void digui(TreeNode* root, int k)
    {
        if(root->left!=NULL)
        {
            digui(root->left,k);
            
        }
        num++;
        if(num==k)
            re = root->val;
        if(root->right!=NULL)
        {
            digui(root->right,k);
            
        }
        return ;
           
    }
};


思路二:

在二叉搜索树种,找到第K个元素。

算法如下:

1、计算左子树元素个数left。

2、 left+1 = K,则根节点即为第K个元素

      left >=k, 则第K个元素在左子树中,

     left +1 <k, 则转换为在右子树中,寻找第K-left-1元素。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
     int calcTreeSize(TreeNode* root){  
        if (root == NULL)  
            return 0;  
        return 1+calcTreeSize(root->left) + calcTreeSize(root->right);          
    } 

    int kthSmallest(TreeNode* root, int k) {
         if (root == NULL)  
            return 0;  
        int leftSize = calcTreeSize(root->left);  
        if (k == leftSize+1){  
            return root->val;  
        }else if (leftSize >= k){  
            return kthSmallest(root->left,k);  
        }else{  
            return kthSmallest(root->right, k-leftSize-1);  

    }
   
           
    }
};

你可能感兴趣的:(leetcode——230——Kth Smallest Element in a BST)