目录
一、110.平衡二叉树
递归法:
/**
* 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 {
public boolean isBalanced(TreeNode root) {
return getHeight(root)!=-1;
}
private int getHeight(TreeNode root)
{
if(root==null) return 0;
int leftHeight=getHeight(root.left);
int rightHeight=getHeight(root.right);
if(leftHeight==-1) return -1;
if(rightHeight==-1) return -1;
if(Math.abs(leftHeight-rightHeight)>1) return -1;
int height=Math.max(leftHeight,rightHeight)+1;
return height;
}
}
还可以采用迭代法来实现,以后再看。
二、257. 二叉树的所有路径
采用递归/回溯
/**
* 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 {
public List<String> binaryTreePaths(TreeNode root) {
List<String>res=new ArrayList<>();
if(root==null) return res;
List<Integer>paths=new ArrayList<>();
traversal(root,paths,res);
return res;
}
private void traversal(TreeNode root,List<Integer>paths,List<String>res)
{
paths.add(root.val);
if(root.left==null&&root.right==null)
{
StringBuilder sb=new StringBuilder();
for(int i=0;i<paths.size()-1;i++)
{
sb.append(paths.get(i)).append("->");
}
sb.append(paths.get(paths.size()-1));
res.add(sb.toString());
return;
}
if(root.left!=null)
{
traversal(root.left,paths,res);
paths.remove(paths.size()-1);
}
if(root.right!=null)
{
traversal(root.right,paths,res);
paths.remove(paths.size()-1);
}
}
}
三、404.左叶子之和
左叶子的明确定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点
判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。
递归三部曲:
1.确定递归函数的参数和返回值
判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int
使用题目中给出的函数就可以了。
2.确定终止条件
如果遍历到空节点,那么左叶子值一定是0
3.确定单层递归的逻辑
当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) return 0;
int leftValue = sumOfLeftLeaves(root.left); // 左
int rightValue = sumOfLeftLeaves(root.right); // 右
int midValue = 0;
if (root.left != null && root.left.left == null && root.left.right == null) {
midValue = root.left.val;
}
int sum = midValue + leftValue + rightValue; // 中
return sum;
}
}