1. 给一个数组。要你变成二叉树,必须满足条件:1. 满足minHeap性质
2. 树的中序遍历和数组顺序一致
2. followup: 给定了上述生成的树,要插入一个新节点,同样要满足上述条件。
2. followup: 给定了上述生成的树,要插入一个新节点,同样要满足上述条件。
followup:如果要插入很多节点,有没有方法提速?
TreeNode generateTree(int[] a, int left, int right) {
if (left > right)
return null;
int min = a[left], index = left;
for (int i = left + 1; i <= right; i++)
if (a[i] < min) {
min = a[i];
index = i;
}
TreeNode root = new TreeNode(a[min]);
root.left = generateTree(a, left, index - 1);
root.right = generateTree(a, index + 1, right);
return root;
}
TreeNode addNode(TreeNode root, int val) {
TreeNode inserted = new TreeNode(val);
if (val <= root.val) {
inserted.left = root;
return inserted;
}
TreeNode curr = root.right, prev = root;
while (curr != null) {
if (val <= curr.val) {
inserted.left = curr;
prev.right = inserted;
return root;
} else {
prev = curr;
curr = curr.right;
}
}
prev.right = inserted;
return root;
}