# 388，先序遍历构造二叉树

//data是插入的结点
private static void addTreeNode(TreeNode root, int data) {
TreeNode node = new TreeNode(data);
TreeNode p = root;
while (true) {
//如果要插入的结点data比结点p的值小，就往p结点的左
//子节点找，否则往p的右子节点找
if (p.val > data) {
//如果p的左子节点等于空，直接放进去
if (p.left == null) {
p.left = node;
break;
} else {
p = p.left;
}
} else {
//如果p的右子节点等于空，直接放进去
if (p.right == null) {
p.right = node;
break;
} else {
p = p.right;
}
}
}
}


public TreeNode bstFromPreorder(int[] preorder) {
TreeNode root = new TreeNode();
root.val = preorder[0];
for (int i = 1; i < preorder.length; i++)
return root;
}


private TreeNode addTreeNode(TreeNode root, int val) {
if (root == null)
return new TreeNode(val);
else if (root.val > val)
else
return root;
}


public TreeNode bstFromPreorder(int[] preorder) {
return buildBST(preorder, 0, preorder.length - 1);
}

//数组的范围从left到right
private TreeNode buildBST(int[] preorder, int left, int right) {
if (left > right)
return null;
TreeNode root = new TreeNode(preorder[left]);
//如果left==right说明只有一个元素，没法再拆分了
if (left == right)
return root;
int i = left;
//拆分为两部分，一部分是比preorder[left]大的，一部分是比preorder[left]小的
while (i + 1 <= right && preorder[i + 1] < preorder[left])
i++;
//区间[left + 1，i]所有元素都在root节点的左子树
//区间[i + 1，right]所有元素都在root节点的右子树
root.left = buildBST(preorder, left + 1, i);
root.right = buildBST(preorder, i + 1, right);
return root;
}


int index = 0;

public TreeNode bstFromPreorder(int[] preorder) {
return bstFromPreorder(preorder, Integer.MAX_VALUE);
}

public TreeNode bstFromPreorder(int[] preorder, int max) {
if (index == preorder.length || preorder[index] > max)
return null;
//把数组中的元素一个个取出来创建节点
TreeNode root = new TreeNode(preorder[index++]);
//左子树的最大值不能超过root.val
root.left = bstFromPreorder(preorder, root.val);
//右子树的最大值不能超过max
root.right = bstFromPreorder(preorder, max);
return root;
}


        if (preorder[i] < stack.peek().val) {
stack.peek().left = node;
}


            TreeNode parent = stack.peek();
//栈从栈底到栈顶是递减的
while (!stack.isEmpty() && preorder[i] > stack.peek().val) {
parent = stack.pop();
}
parent.right = node;


public TreeNode bstFromPreorder(int[] preorder) {
Stack<TreeNode> stack = new Stack<>();
TreeNode root = new TreeNode(preorder[0]);
stack.push(root);
for (int i = 1; i < preorder.length; i++) {
TreeNode node = new TreeNode(preorder[i]);
//小于栈顶元素的值，说明应该在栈顶元素的左子树
if (preorder[i] < stack.peek().val) {
stack.peek().left = node;
} else {//大于栈顶元素的值，我们要找到当前元素的父节点
TreeNode parent = stack.peek();
//栈从栈底到栈顶是递减的
while (!stack.isEmpty() && preorder[i] > stack.peek().val) {
parent = stack.pop();
}
parent.right = node;
}
//节点压栈
stack.push(node);
}
return root;
}


• 点赞
• 评论
• 分享
x

海报分享

扫一扫，分享海报

• 收藏
• 手机看

分享到微信朋友圈

x

扫一扫，手机阅读

• 打赏

打赏

数据结构和算法

你的鼓励将是我创作的最大动力

C币 余额
2C币 4C币 6C币 10C币 20C币 50C币
• 一键三连

点赞Mark关注该博主, 随时了解TA的最新博文
05-05 842

04-08 415
05-05 168
06-25 333
03-10 541
04-01 248