题目描述
根据给定的二叉搜索树的先根遍历,把二叉搜索树建立起来,返回它的根
由于涉及到二叉树,光用文字描述可能会不好理解,可以点击直接看题目
解题思路
这道题最关键的是要充分利用二叉搜索树的特点。
先明确一下二叉搜索树的概念:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
我们对照一棵二叉搜索树的先根遍历数组来看:[8,5,1,7,10,12]
。
既然是先根,那么第0个元素必然是整个二叉树的根,这个很容易理解。由于在二叉搜索树中,左子树节点的值都小于根节点的值,那么从第1个元素开始往后找,直到找到最后一个小于根节点的值,这部分就是根节点的左子树,那么自然而然数组后面的元素就是根节点的右子树,值都大于根节点的值,然后递归处理就可以。
代码如下:
class Solution {
public TreeNode bstFromPreorder(int[] preorder) {
if (preorder == null || preorder.length == 0)
return null;
TreeNode root = new TreeNode(preorder[0]);
int index = 1;
for (; index < preorder.length; ++index) {
if (preorder[index] > preorder[0])
break;
}
root.left = bstFromPreorder(Arrays.copyOfRange(preorder, 1, index));
root.right = bstFromPreorder(Arrays.copyOfRange(preorder, index, preorder.length));
return root;
}
}