1. 程式人生 > >每天一道LeetCode-----尋找二叉搜尋樹中第k小的元素

每天一道LeetCode-----尋找二叉搜尋樹中第k小的元素

Kth Smallest Element in a BST

這裡寫圖片描述

給頂一個二叉搜尋樹的根節點,找到這棵數第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 kthSmallest(TreeNode* root, int k) { int res = 0; inOrder(root, k, res); return res; } private: void inOrder(TreeNode* root, int& k, int& res) { if(!root || !k) return; inOrder(root->left, k, res); //找到k個數即可
if(--k == 0) res = root->val; inOrder(root->right, k, res); } };

迭代法,用棧實現

/**
 * 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 kthSmallest(TreeNode* root, int k) { stack<TreeNode*> s; pushAllLeft(root, s); TreeNode* top = nullptr; while(k--) { top = s.top(); s.pop(); //每彈出一個節點就將該節點的右子樹的左邊一列入棧 pushAllLeft(top->right, s); } return top->val; } private: void pushAllLeft(TreeNode*root, stack<TreeNode*>& s) { while(root) { s.push(root); root = root->left; } } };

本題主要考察中序遍歷,除了遞迴法最好可以熟悉迭代法的求解