上次编辑到这里,代码来自缓存 点击恢复默认模板
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* bstFromPreorder(vector<int>& preorder) {
}
};
java 解法, 执行用时: 1 ms, 内存消耗: 39.4 MB, 提交时间: 2022-11-19 18:31:50
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
import java.util.ArrayDeque;
import java.util.Deque;
public class Solution {
public TreeNode bstFromPreorder(int[] preorder) {
int len = preorder.length;
if (len == 0) {
return null;
}
TreeNode root = new TreeNode(preorder[0]);
Deque<TreeNode> stack = new ArrayDeque<>();
stack.push(root);
for (int i = 1; i < len; i++) {
// 将栈的最后一个元素作为父元素,并从下一个前序遍历的节点创建子节点
TreeNode node = stack.peekLast();
TreeNode currentNode = new TreeNode(preorder[i]);
// 栈中小于当前节点值的元素全部出栈,当前节点连接到最后一个弹出栈的结点的右边
while (!stack.isEmpty() && stack.peekLast().val < currentNode.val) {
node = stack.removeLast();
}
if (node.val < currentNode.val) {
node.right = currentNode;
} else {
node.left = currentNode;
}
stack.addLast(currentNode);
}
return root;
}
}
java 解法, 执行用时: 0 ms, 内存消耗: 39.6 MB, 提交时间: 2022-11-19 18:31:22
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
public class Solution {
private int index = 0;
private int[] preorder;
private int len;
/**
* 深度优先遍历,遍历的时候把左右边界的值传下去
*
* @param preorder
* @return
*/
public TreeNode bstFromPreorder(int[] preorder) {
this.preorder = preorder;
this.len = preorder.length;
return dfs(Integer.MIN_VALUE, Integer.MAX_VALUE);
}
/**
* 通过下限和上限来控制指针移动的范围
*
* @param lowerBound
* @param upperBound
* @return
*/
private TreeNode dfs(int lowerBound, int upperBound) {
// 所有的元素都已经添加到了二叉树中
if (index == len) {
return null;
}
int cur = preorder[index];
if (cur < lowerBound || cur > upperBound) {
return null;
}
index++;
TreeNode root = new TreeNode(cur);
root.left = dfs(lowerBound, cur);
root.right = dfs(cur, upperBound);
return root;
}
}
java 解法, 执行用时: 0 ms, 内存消耗: 39.7 MB, 提交时间: 2022-11-19 18:30:51
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
public class Solution {
public TreeNode bstFromPreorder(int[] preorder) {
int len = preorder.length;
if (len == 0) {
return null;
}
return dfs(preorder, 0, len - 1);
}
/**
* 根据 preorder 的子区间 [left..right] 构建二叉树
*
* @param preorder
* @param left
* @param right
* @return
*/
private TreeNode dfs(int[] preorder, int left, int right) {
if (left > right) {
return null;
}
TreeNode root = new TreeNode(preorder[left]);
if (left == right) {
return root;
}
// 在区间 [left..right] 里找最后一个小于 preorder[left] 的下标
// 注意这里设置区间的左边界为 left ,不能是 left + 1
// 这是因为考虑到区间只有 2 个元素 [left, right] 的情况,第 1 个部分为空区间,第 2 部分只有一个元素 right
int l = left;
int r = right;
while (l < r) {
int mid = l + (r - l + 1) / 2;
if (preorder[mid] < preorder[left]) {
// 下一轮搜索区间是 [mid, r]
l = mid;
} else {
// 下一轮搜索区间是 [l, mid - 1]
r = mid - 1;
}
}
TreeNode leftTree = dfs(preorder, left + 1, l);
TreeNode rightTree = dfs(preorder, l + 1, right);
root.left = leftTree;
root.right = rightTree;
return root;
}
}
java 解法, 执行用时: 1 ms, 内存消耗: 39.9 MB, 提交时间: 2022-11-19 18:30:13
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class Solution {
public TreeNode bstFromPreorder(int[] preorder) {
int len = preorder.length;
Map<Integer, Integer> hashMap = new HashMap<>();
int[] inorder = new int[len];
System.arraycopy(preorder, 0, inorder, 0, len);
Arrays.sort(inorder);
int index = 0;
for (Integer value : inorder) {
hashMap.put(value, index);
index++;
}
return dfs(0, len - 1, 0, len - 1, preorder, hashMap);
}
public TreeNode dfs(int preLeft, int preRight, int inLeft, int inRight, int[] preorder, Map<Integer, Integer> hashMap) {
if (preLeft > preRight || inLeft > inRight) {
return null;
}
int pivot = preorder[preLeft];
TreeNode root = new TreeNode(pivot);
int pivotIndex = hashMap.get(pivot);
root.left = dfs(preLeft + 1, pivotIndex - inLeft + preLeft,
inLeft, pivotIndex - 1, preorder, hashMap);
root.right = dfs(pivotIndex - inLeft + preLeft + 1, preRight,
pivotIndex + 1, inRight, preorder, hashMap);
return root;
}
}
javascript 解法, 执行用时: 72 ms, 内存消耗: 42.9 MB, 提交时间: 2022-11-19 18:29:40
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {number[]} preorder
* @return {TreeNode}
*/
var bstFromPreorder = function(preorder) {
var tree = new TreeNode();
preorder.map(i => {
tree.insert(i);
})
return tree.root;
function TreeNode() {
this.root = null;
// 生成二叉树
this.insert = function(val) {
var newNode = new Node(val);
if (this.root === null) {
this.root = newNode;
} else {
insertNode(this.root, newNode);
}
}
// 二叉树节点
function Node(val) {
this.val = val;
this.left = null;
this.right = null;
}
// 小于当前节点val,插入到left
// 大于或等于当前节点val,插入到right
function insertNode(node, newNode) {
if (newNode.val < node.val) {
if (node.left === null) {
node.left = newNode;
} else {
insertNode(node.left, newNode);
}
} else {
if (node.right === null) {
node.right = newNode;
} else {
insertNode(node.right, newNode);
}
}
}
}
};