LeetCode 30天挑戰 Day-20

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]
img

Note:

  1. 1 <= preorder.length <= 100
  2. The values of preorder are distinct.

Solution

題目要求分析:給定一個二叉搜索樹的前序遍歷序列,要求還原該二叉樹。

解法:

本題只要瞭解:

  1. 二叉搜索樹的特性:
    1. 對任意結點,其結點值永遠滿足(如果存在):左兒子 < 根 < 右兒子
    2. 由此推出,左子樹任意值 < 根 < 右子樹任意值
  2. 前序遍歷:根 -> 左 -> 右 順序進行遍歷。

由此,總結還原的思想是:

  1. 對當前序列,第一個值是根結點,剩餘序列中,比第一個值小的是左子樹,剩餘爲右子樹。
  2. 遞歸操作即可,當序列只有一個元素時,直接返回。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章