目录
654 最大二叉树
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return buildHelper(nums,0,nums.length);
}
private TreeNode buildHelper(int[] nums,int start,int end){
if(end == start)return null;
int mid = start;
for(int i = start;i < end;i++){
if(nums[mid] < nums[i]){
mid = i;
}
}
TreeNode cur = new TreeNode(nums[mid]);
cur.left = buildHelper(nums,start,mid);
cur.right = buildHelper(nums,mid + 1,end);
return cur;
}
}
时间复杂度O(n^2)递归所需要的时间×遍历nums所需要的时间
空间复杂度O(n)需要使用的栈空间
617 合并二叉树
递归
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if(root1 == null)return root2;
if(root2 == null)return root1;
root1.val += root2.val;
root1.left = mergeTrees(root1.left,root2.left);
root1.right = mergeTrees(root1.right,root2.right);
return root1;
}
}
时间复杂度O(min(n,m))n,m为两棵树中节点的个数
空间复杂度O(min(n,m))
迭代
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if(root1 == null)return root2;
if(root2 == null)return root1;
Deque<TreeNode>st = new LinkedList<>();
st.push(root2);
st.push(root1);
while(!st.isEmpty()){
TreeNode node1 = st.pop();
TreeNode node2 = st.pop();
node1.val += node2.val;
if(node1.left != null && node2.left != null){
st.push(node2.left);
st.push(node1.left);
}else if(node1.left == null)node1.left = node2.left;
if(node1.right != null && node2.right != null){
st.push(node2.right);
st.push(node1.right);
}else if(node1.right == null)node1.right = node2.right;
}
return root1;
}
}
时间复杂度O(min(n,m))
空间复杂度O(min(n,m))
700 二叉搜索树中的搜索
二叉搜索树:在val小的在根节点左边,val大的在根节点右边
迭代
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
while(root != null){
if(root.val < val)root = root.right;
else if(root.val > val)root = root.left;
else return root;
}
return null;
}
}
时间复杂度O(n)
空间复杂度O(n)
递归
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if(root == null)return null;
if(root.val == val)return root;
return root.val < val ? searchBST(root.right,val) : searchBST(root.left,val);
}
}
时间复杂度O(n)
空间复杂度O(1)
98 验证二叉搜索树
要注意左树的所有节点要小于中间节点,右树的所有节点大于中间节点,不能单纯使左节点小于中间节点,右节点大于中间节点。
因为树存储的值可能为int的最小值或者int的最大值,所以需要使用long来存储
class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root,Long.MIN_VALUE,Long.MAX_VALUE);
}
private boolean isValidBST(TreeNode cur,long lower,long upper){//因为树存储的值可能为int的最小值或者int的最大值,所以使用long来存储
if(cur == null)return true;
if(cur.val >= upper)return false;
if(cur.val <= lower)return false;
return isValidBST(cur.left,lower,cur.val) && isValidBST(cur.right,cur.val,upper);
}
}
时间复杂度O(n)
空间复杂度O(n)