给定一个不重复的整数数组 nums
。 最大二叉树 可以用下面的算法从 nums
递归地构建:
- 创建一个根节点,其值为
nums
中的最大值。 - 递归地在最大值 左边 的 子数组前缀上 构建左子树。
- 递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums
构建的 最大二叉树
思路:
1:传入数组nus,以及左右索引,方便我们切割数组,数组我们统一使用左闭右开区间,方便后续切割。
2:如果当前数组长度小于1,说明以及没有节点返回null。如果当前有一个节点证明是根节点,此时需要返回一个节点等待被上一个节点的左子树或者右子树承接。
3:寻找数组中的最大值对应的索引,使用最大值构建根节点,切割数组,递归左子树和右子树。结束
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return MaxTree(nums,0,nums.length);
}
//构建最大二叉树
private TreeNode MaxTree(int[] nums,int left,int right){
//给定的数组最小也有一个节点,不需要进行非空校验
if(right-left<1) return null;
//如果当前数组只有一个元素,说明只剩一个节点
//直接返回
//我们使用左闭右开区间
if(right-left==1){
//只有一个节点,直接返回
return new TreeNode(nums[left]);
}
//求解数组的最大值
int index=left;
int maxvalue=nums[left];
//一定要保证分割的左右数组一定有一个元素
for(int i=left+1;i<right;i++){
if(nums[i]>maxvalue){
maxvalue=nums[i];
index=i;
}
}
//构建根节点
TreeNode node=new TreeNode(maxvalue);
node.left=MaxTree(nums,left,index);
node.right=MaxTree(nums,index+1,right);
return node;
}
}
给你两棵二叉树: root1
和 root2
。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
思路:
1,返回构建的树的节点,传入两个树的根节点
2,如果左树为空,返回左树。反之则返回右树,左右都为空其实合上书情况一样。
3,两个树都不为空,合并节点值,将其给左树,因为我们不需要重新构建一个树,所以只需要改变左树即可,之后合并左子树和右子树,最后返回左树。
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
//不单独创建新的树,就在原有root1的基础上进行修改
if(root1==null) return root2;
if(root2==null) return root1;
//如果root1和root2同时为null,其实都是返回空都一样
//不需要再次进行单独判断
//当两个节点都不为空时,进行树的合并操作
root1.val+=root2.val;
//合并完成之后继续递归合并左子树
root1.left=mergeTrees(root1.left,root2.left);
root1.right=mergeTrees(root1.right,root2.right);
return root1;
}
}
给定二叉搜索树(BST)的根节点 root
和一个整数值 val
。
你需要在 BST 中找到节点值等于 val
的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null
。
思路:
首先,我们需要确定二叉搜索树的特性,那就是左子树的所有值小于右子树
1,递归函数返回值为根节点,传入节点以及目标值tar
2,如果当前节点为空或者当前节点值等于目标值,直接返回当前节点即可。
3,定义一个节点用来接受递归函数的额返回值,如果目标值大于根节点,递归搜索右子树,反之搜索左子树,最终返回结果节点即可。
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if(root==null || root.val==val) return root;
TreeNode result=null;
if(val>root.val){
result=searchBST(root.right,val);
}else{
result=searchBST(root.left,val);
}
return result;
}
}
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树、
思路:根据二叉搜索树的特性使用前序遍历二叉树,获得遍历之后的结果数组,如果后续值小于 等于前面的值,说明不是二叉搜索树,直接结束即可。
class Solution {
List<Integer> res=new ArrayList<>();
public boolean isValidBST(TreeNode root) {
dfs(root);
for(int i=1;i<res.size();i++){
if(res.get(i)<=res.get(i-1)){
return false;
}
}
return true;
}
private boolean dfs(TreeNode root){
if(root==null) return true;
dfs(root.left);
res.add(root.val);
dfs(root.right);
return true;
}
}
By 三条直线围墙!!