題目
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;
}
}