[LeetCode] 1008. Construct Binary Search Tree from Preorder Traversal (java)

題目

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.


翻譯

  • 先序遍歷構造二叉樹

返回與給定先序遍歷 preorder 相匹配的二叉搜索樹(binary search tree)的根結點。

(回想一下,二叉搜索樹是二叉樹的一種,其每個節點都滿足以下規則,對於 node.left 的任何後代,值總 < node.val,而 node.right 的任何後代,值總 > node.val。此外,先序遍歷首先顯示節點的值,然後遍歷 node.left,接着遍歷 node.right。)

思路

  • 給定的輸入數組是二叉搜索樹按照先序遍歷得到的
    • 二叉搜索樹:根的值比所有左子樹節點值都大,比所有右子樹節點值都小
    • 先序遍歷:先訪問根,然後左節點,最後右節點
  • 根據二叉搜索樹和先序遍歷的特點,由下圖可知,關鍵是找到第一個大於根節點值的下標,左側爲根節點左子樹(5,1,7),右側(包括其)爲根節點右子樹(10,12)
  • 因爲其爲先序遍歷,所有左子樹的根爲左側第一個節點(5),右子樹的根爲右側第一個節點(10)
  • 依次進行,得到最終的樹
    在這裏插入圖片描述

代碼

class Solution {
    public TreeNode bstFromPreorder(int[] preorder) {
        if (preorder == null || preorder.length <= 0) return null;
        return bstFromPreorder(preorder, 0, preorder.length - 1);
    }

    public TreeNode bstFromPreorder(int[] preorder, int left, int right) {
        if (left > right) return null;
        TreeNode node = new TreeNode(preorder[left]);
        int i = left + 1;
        for (; i <= right; i++) {
            if (preorder[i] > preorder[left]) break;
        }
        node.left = bstFromPreorder(preorder, left + 1, i - 1);
        node.right = bstFromPreorder(preorder, i, right);
        return node;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章