LeetCode 30 days Challenge - Day 20
本系列將對LeetCode新推出的30天算法挑戰進行總結記錄,旨在記錄學習成果、方便未來查閱,同時望爲廣大網友提供幫助。
Construct Binary Search Tree from Preorder Traversal
Return the root node of a binary search tree that matches the given preorder
traversal.
(Recall that a binary search tree is a binary tree where for every node, any descendant of node.left
has a value <
node.val
, and any descendant of node.right
has a value >
node.val
. Also recall that a preorder traversal displays the value of the node
first, then traverses node.left
, then traverses node.right
.)
Example 1:
Input: [8,5,1,7,10,12]
Output: [8,5,10,1,7,null,12]
Note:
1 <= preorder.length <= 100
- The values of
preorder
are distinct.
Solution
題目要求分析:給定一個二叉搜索樹的前序遍歷序列,要求還原該二叉樹。
解法:
本題只要瞭解:
- 二叉搜索樹的特性:
- 對任意結點,其結點值永遠滿足(如果存在):
左兒子 < 根 < 右兒子
; - 由此推出,
左子樹任意值 < 根 < 右子樹任意值
;
- 對任意結點,其結點值永遠滿足(如果存在):
- 前序遍歷:
根 -> 左 -> 右
順序進行遍歷。
由此,總結還原的思想是:
- 對當前序列,第一個值是根結點,剩餘序列中,比第一個值小的是左子樹,剩餘爲右子樹。
- 遞歸操作即可,當序列只有一個元素時,直接返回。
TreeNode* build(vector<int>& preorder, int l, int r) {
if (l == r) return new TreeNode(preorder[l]);
TreeNode* root = new TreeNode(preorder[l]);
int i = l + 1;
while (i <= r && preorder[i] < root->val) i++;
root->left = (i == l + 1) ? NULL : build(preorder, l + 1, i - 1);
root->right = (i > r) ? NULL : build(preorder, i, r);
return root;
}
TreeNode* bstFromPreorder(vector<int>& preorder) {
if (preorder.empty()) return NULL;
return build(preorder, 0, preorder.size()-1);
}
傳送門:Construct Binary Search Tree from Preorder Traversal
2020/4 Karl