1. 程式人生 > >演算法練習筆記(七)——在BST樹中的遍歷

演算法練習筆記(七)——在BST樹中的遍歷

一般來說,BST(二叉排序樹)有分三種遍歷,前序遍歷,中序遍歷和後序遍歷。

前序遍歷順序是根在前的根,左子樹,右子樹(也是我們一般來表示一棵樹的方法)

中序:左子樹,根,右子樹 

後序:左子樹,右子樹,根

值得注意的是在BST樹的中序遍歷之中,結果必然是遞增的。

於是對於下面這一道題目:

源地址:https://leetcode.com/problems/kth-smallest-element-in-a-bst/#/description

題目: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小的資料查找出現了困難,這時就想如果能夠擁有一個數組,將樹中各項從小到大順序排列,直接查詢就好了

於是就想到了複雜度為O(N)的中序遍歷,解法如下:

/**
 * 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 {
private:
    vector<int> nums;
public:
    void Traver(TreeNode * root){
        if(!root -> left && !root -> right){
            nums.push_back(root -> val);
        }
        else if(root -> left){
            Traver(root -> left);
            nums.push_back(root -> val);
            if(root -> right)
            Traver(root -> right);
        }
        else{
            nums.push_back(root -> val);
            Traver(root -> right);
        }
        
    }
    int kthSmallest(TreeNode* root, int k) {
        if(root == NULL)return 0;
        Traver(root);
        return nums[k - 1];
    }
};
這或許在時間複雜度之中不算得最優解法,但是卻有著簡潔明瞭的優點。