110. 平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
递归求高度解题:
本题可转换为递归求二叉树节点中左右子树的高度差,使用递归后序遍历实现(因为要先求左右子树的高度将结果返回给父节点)若高度差>1,则返回-1.否则返回左右孩子高度的最大值+1作为父节点的高度。
递归三要素:
-
确定递归函数的参数和返回值: 根节点作为参数,返回值为左右节点高度取大值的高度+1,若高度差大于1,则返回-1.
-
确定终止条件:当遍历到空节点时,说明当前节点高度为0,返回0.
-
确定单层递归的逻辑:后序遍历求高度,遍历完左右子树后,将结果返回给根节点。
class Solution { public boolean isBalanced(TreeNode root) { return getHeight(root)!=-1; } public int getHeight(TreeNode node){ if(node==null){return 0;} int lheight=getHeight(node.left); if(lheight==-1) return -1; int rheight=getHeight(node.right); if(rheight==-1) return -1; int res=Math.abs(lheight-rheight); if(res>1){return -1;} else{ res = Math.max(lheight,rheight) + 1; } return res; } }
257. 二叉树的所有路径
给你一个二叉树的根节点
root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
递归回溯求解:
首先定义一个Integer类型paths集合存放所有所有路径,在定义一个string类型res集合作为结果返回。
定义traversal函数。采用前序遍历,每遍历一个节点将节点添加到list集合中。先将节点加入到集合中,再判断是否为叶子结点,若是,则返回。因为若直接返回,则该叶子结点还未添加到集合中。
判断该节点是否有左右孩子,若有,将该节点加入集合并回溯弹出该节点。递归调用traversal函数直至遍历到叶子结点。注意,遍历将该条路径转换为String类型添加到res中。
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> res=new ArrayList<>();
List<Integer> path=new ArrayList<>();
if(root == null ){return res;}
traversal(root,path,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)+"->");
}
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.左叶子之和
给定二叉树的根节点 root
,返回所有左叶子之和。
左叶子:该节点为叶子结点并且该节点为父节点的左孩子。
递归遍历求解:
我其实不是很理解这个代码。。这三个变量的定义。。我对递归感觉越来越不熟悉了。。
采用后序遍历,先遍历左右子树,最后将结果返回给父节点。
如何判断该节点为左叶子? node.left!=null&&node.left.left==null&node.left.right==null
此时node.left即为左叶子。
定义traversal函数。参数为根节点。当遍历到叶子结点(我们需要的是叶子结点的父节点)/空节点时,返回0。
分别对左右孩子进行遍历。最后将左右孩子遍历结果之和返回即可。
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
return traversal(root);
}
public int traversal(TreeNode node){
if(node==null){return 0;}
int left=traversal(node.left);
int right=traversal(node.right);
int mid=0;
if(node.left!=null&&node.left.left==null&&node.left.right==null){mid=node.left.val;}
return mid+left+right;
}
}