演算法練習筆記(七)——在BST樹中的遍歷
阿新 • • 發佈:2019-02-18
一般來說,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
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小的資料查找出現了困難,這時就想如果能夠擁有一個數組,將樹中各項從小到大順序排列,直接查詢就好了
於是就想到了複雜度為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]; } };