654.最大二叉树
-
题目链接:代码随想录
-
解题思路:
构建二叉树的题目都是前序遍历,因为只有先建立起根节点,才能谈建立其他节点
这类递归题目就是将大问题分解成一个个小问题,进而求解和给出前序遍历数组和后序遍历数组题很相似
public TreeNode constructMaximumBinaryTree(int[] nums) {
return traversal(nums);
}
public TreeNode traversal(int[] nums){
//判断终止条件
if(nums.length == 1){
return new TreeNode(nums[0]);
}
//处理中节点
int maxValue = 0;
int index = 0;//找索引位置
for (int i = 0; i < nums.length; i++) {
if(nums[i] > maxValue){
maxValue = nums[i]; //更新最大值
index = i;
}
}
TreeNode root = new TreeNode(nums[index]);
//分割数组处理左右节点
//传入分割好的数组,递归构建左右子树
//保证能构建左子树
if(index > 0){
int[] leftNums = Arrays.copyOfRange(nums, 0, index);//[0,index)
root.left = traversal(leftNums);
}
//确保能构建右子树
if(index < nums.length - 1){
int[] rightNums = Arrays.copyOfRange(nums, index + 1, nums.length);//[0,index)
root.right = traversal(rightNums);
}
//返回构建好的二叉树
return root;
}
617.合并二叉树
题目链接:代码随想录
-
采用前序遍历遍历二叉树
一般建立二叉树都要采取前序遍历- 解题思路:
这里将root1子树处理,将处理后的结果root1返回
- 解题思路:
-
①参数和返回值:参数为两棵树,返回值应该为处理后的节点值
②终止条件:如果root1 == null说明,root1左子树为空,返回root2(如果root2也为空,那就都为空)同理对于root2也是一样的思路③中节点处理逻辑:左子树加上右子树的值
④然后分别合并左右子树出结果
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;
}
700.二叉搜索树中的搜索
题目链接:代码随想录
-
二叉搜索树的认识:
二叉搜索树大于根节点的值都在右边,小于根节点的值都在左边,所以给出一个数组就可以画出一棵符合条件的二叉树对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向,因此
由于节点的有序性,**可以不使用辅助栈或者队列就可以写出迭代法。**直接进行遍历就可以写出来 -
递归法解题思路:
①参数和返回值:参数为每层要处理的节点和要比对的值,返回值为当前找到的元素
②终止条件:当遍历到某一层,root为null 或者 root.val满足题目要求的时候,返回结果
③处理逻辑:先比较中节点,再比较左右节点
public TreeNode searchBST(TreeNode root, int val) {
//终止条件
if(root == null || root.val == val){
return root;
}
TreeNode result = null;//定义接收结果的值
//递归处理
if(root.val > val){
result = searchBST(root.left, val);
}
if(root.val < val){
result = searchBST(root.right, val);
}
return result;
}
public TreeNode searchBST(TreeNode root, int val) {
while(root != null){
if(root.val > val){
root = root.left;
}else if(root.val < val){
root = root.right;
}else{
return root;
}
}
//遍历到头了
return root;
}
98.验证二叉搜索树
题目链接:代码随想录
-
解题思路一(借助数组):
①将二叉搜索树中序遍历成数组,然后看看数组是否有序解题思路二(利用二叉搜索树的性质):
public boolean isValidBST(TreeNode root) {
traversal(root);
for (int i = 1; i < result.size(); i++) { //i从1开始
if(result.get(i) <= result.get(i - 1)){ //这里是<=
return false;
}
}
return true;
}
public void traversal(TreeNode root){
if(root == null){
return;
}
traversal(root.left);
result.add(root.val);
traversal(root.right);
}
class Solution5 {
// 递归
TreeNode max;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
// 左
boolean left = isValidBST(root.left);
if (!left) {
return false;
}
// 中
if (max != null && root.val <= max.val) {
return false;
}
max = root;
// 右
boolean right = isValidBST(root.right);
return right;
}
}
// 中
if (max != null && root.val <= max.val) {
return false;
}
max = root;
// 右
boolean right = isValidBST(root.right);
return right;
}
}