提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- [一、力扣113. 路径总和 II](#一、力扣113. 路径总和 II)
- [二、力扣1430. 判断给定的序列是否是二叉树从根到叶的路径](#二、力扣1430. 判断给定的序列是否是二叉树从根到叶的路径)
- [三、力扣897. 递增顺序搜索树](#三、力扣897. 递增顺序搜索树)
- [四、力扣938. 二叉搜索树的范围和](#四、力扣938. 二叉搜索树的范围和)
前言
二叉树的递归分为「遍历」和「分解问题」两种思维模式,这道题可以同时用到两种思维模式。 「遍历」的话很简单,你对 BST 做中序遍历,其结果就是有序的,重新构造出题目要求的这个类似链表的二叉树即可。
一、力扣113. 路径总和 II
java
/**
* 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;
* }
* }
*/
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
if(root == null){
return new ArrayList<>();
}
fun(root,targetSum,0);
return res;
}
public void fun(TreeNode root,int targetSum, int sum){
if(root == null){
return;
}
path.add(root.val);
if(root.left == null && root.right == null){
if(sum + root.val == targetSum){
res.add(new ArrayList<>(path));
}
path.remove(path.size()-1);
return;
}
fun(root.left,targetSum,sum+root.val);
fun(root.right,targetSum,sum+root.val);
path.remove(path.size()-1);
}
}
二、力扣1430. 判断给定的序列是否是二叉树从根到叶的路径
java
/**
* 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;
* }
* }
*/
class Solution {
int len = 0;
boolean flag = false;
public boolean isValidSequence(TreeNode root, int[] arr) {
len = arr.length-1;
fun(root,arr,0);
return flag;
}
public void fun(TreeNode root, int[] arr , int index){
if(root == null || index > len){
return;
}
if(root.val == arr[index]){
if(index == len && root.left == null && root.right == null){
flag = true;
}
fun(root.left,arr,index+1);
fun(root.right,arr,index+1);
}
return;
}
}
三、力扣897. 递增顺序搜索树
java
/**
* 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;
* }
* }
*/
class Solution {
TreeNode pre = null, first = null;
boolean flag = true;
public TreeNode increasingBST(TreeNode root) {
fun(root);
pre.left = null;
pre.right = null;
return first;
}
public void fun(TreeNode root){
if(root == null){
return;
}
fun(root.left);
if(pre != null){
pre.right = root;
pre.left = null;
}
pre = root;
if(flag){
first = root;
flag = false;
}
fun(root.right);
}
}
四、力扣938. 二叉搜索树的范围和
java
/**
* 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;
* }
* }
*/
class Solution {
int sum = 0;
public int rangeSumBST(TreeNode root, int low, int high) {
fun(root,low,high);
return sum;
}
public void fun(TreeNode root, int low, int high){
if(root == null){
return ;
}
if(root.val > high){
fun(root.left,low,high);
}else if(root.val < low){
fun(root.right,low,high);
}else{
sum += root.val;
fun(root.left,low,high);
fun(root.right,low,high);
}
}
}