文章目录
- [1. 计算布尔二叉树的值(LC2331)](#1. 计算布尔二叉树的值(LC2331))
- [2. 求根节点到叶节点数字之和(LC129)](#2. 求根节点到叶节点数字之和(LC129))
- [3. 二叉树剪枝(LC814)](#3. 二叉树剪枝(LC814))
- [4. 验证二叉搜索树(LC98)](#4. 验证二叉搜索树(LC98))
- [5. 二叉搜索树中第K小的元素(LC230)](#5. 二叉搜索树中第K小的元素(LC230))
- [6. 二叉树的所有路径(LC257)](#6. 二叉树的所有路径(LC257))
1. 计算布尔二叉树的值(LC2331)
题目描述

解题思路
递归调用得到左右子树的布尔值,再根据根节点的操作符计算。
代码实现
java
public boolean evaluateTree(TreeNode root) {
if(root.left==null && root.right==null)
return root.val == 1;
boolean left = evaluateTree(root.left);
boolean right = evaluateTree(root.right);
if(root.val == 2)
return left || right;
if(root.val == 3)
return left && right;
return true;
}
2. 求根节点到叶节点数字之和(LC129)
题目描述

解题思路

对于每一个被遍历的节点:
- 接收前面的路径和
- 调用dfs得到左子树的路径和
- 调用dfs得到左子树的路径和
- 把左右子树的路径和加和返回
函数头:
- 参数:
root,presum - 返回值:该节点左右子树的路径和
代码实现
java
public int sumNumbers(TreeNode root) {
return dfs(root,0);
}
int dfs(TreeNode root,int preSum){
if(root==null)
return 0;
preSum = preSum*10 + root.val;
//叶子节点
if(root.left==null && root.right==null)
return preSum;
return dfs(root.left,preSum) + dfs(root.right,preSum);
}
3. 二叉树剪枝(LC814)
题目描述

解题思路
递归调用函数,如果子树全为0,就自身的两个孩子指向改为null,返回null。如果左右接收值都是null,继续返回null。
代码实现
java
public TreeNode pruneTree(TreeNode root) {
if(root==null)
return null;
if(pruneTree(root.left)==null)
root.left = null;
if(pruneTree(root.right)==null)
root.right = null;
if(root.left==null && root.right == null && root.val ==0)
root = null;
return root;
}
4. 验证二叉搜索树(LC98)
题目描述

解题思路
二叉搜索树的中序遍历是有序序列。定义全局变量prev记录前一个节点的值,遍历到下一个节点只需要与前一个做比较。当有一个不符合直接返回false,整体就不是二叉搜索树。
代码实现
java
class Solution {
long prev = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if(root==null)
return true;
//剪枝
if(!isValidBST(root.left))
return false;;
if(root.val<=prev)
return false;
else
prev = root.val;
//剪枝
if(!isValidBST(root.right))
return false;
return true;
}
}
5. 二叉搜索树中第K小的元素(LC230)
题目描述

解题思路
利用二叉搜索树中序遍历,定义全局变量cnt和ret,每遍历一个节点,cnt--,当cnt为0时,ret置为对应的节点,直接返回,后续都不需要再遍历(剪枝)
代码实现
java
class Solution {
int cnt;
int ret;
public int kthSmallest(TreeNode root, int k) {
cnt = k;
dfs(root);
return ret;
}
void dfs(TreeNode root){
if(root==null || cnt<=0)
return;
dfs(root.left);
if(cnt==1){
ret=root.val;
cnt--;
return;
}else
cnt--;
dfs(root.right);
}
}
6. 二叉树的所有路径(LC257)
题目描述

解题思路
定义全局变量String[] ret存放结果。
- 函数头:
void dfs(TreeNode root,String path);
注意:path也可以设置为全局变量,但是函数返回的时候要"回复现场",操作比较麻烦,把它作为函数参数,返回时形参不会影响实参的值。
代码实现
java
class Solution {
List<String> ret = new ArrayList();
public List<String> binaryTreePaths(TreeNode root) {
String path = "";
dfs(root,path);
return ret;
}
void dfs(TreeNode root,String path){
if(root==null)
return;
String newPath;
if(path.equals(""))
newPath = root.val+"";
else
newPath = path+"->"+root.val;
dfs(root.left,newPath);
dfs(root.right,newPath);
if(root.left==null && root.right==null)
ret.add(newPath);
}
}