①、平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
事例:
输入:root = [3,9,20,null,null,15,7] 输出:true
思路:
平衡性取决于树的左右两边的高度,要遍历所有子树,确保所有子树都平衡,故递归采用左右中顺序遍历,若有其中一颗子树不平衡,则不用判断,一直返回特殊结果表示为不平衡树,故可以用-1代替高度代表不平衡。(做法跟求高度类似,边求高度边判断是否平衡)。
代码:
public boolean isBalanced(TreeNode root) {
int high = maxDepth(root);
if(high == -1) return false;
else return true;
}
public int maxDepth(TreeNode root){
if(root == null) return 0;
int left = maxDepth(root.left);
if(left == -1) return -1;
int right = maxDepth(root.right);
if(right == -1) return -1;
int sub = Math.abs(left - right);
if(sub > 1){
return -1;
}else{
return Math.max(left,right) + 1;
}
}
②、二叉树的所有路径
给你一个二叉树的根节点
root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。
事例:
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
思路:
遍历路径的顺序其实跟前序遍历一样,故可以使用前序遍历,依次添加路径。将结果集合当做一个全局变量,每次遍历都需要传入当前路径String s,当遇到叶子结点时,引用全局变量添加即可。
代码:
private List<String> res = new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
preorder(root,"");
return res;
}
public void preorder(TreeNode root,String s){
if(root == null) return;
if(root.left == null && root.right == null){
//叶子结点
String tmp = new StringBuilder(s).append(root.val).toString();
res.add(tmp);
return;
}
String tmp = new StringBuilder(s).append(root.val).append("->").toString();
preorder(root.left,tmp);
preorder(root.right,tmp);
}
③、左叶子之和
给定二叉树的根节点
root
,返回所有左叶子之和。
事例:
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
思路:
递归:跟上题求所有路径一致,将结果int作为全局变量,便于各个栈空间调用。递归过程中顺便传入标志位(boolean isLeft),表示是否为左边的结点,当遍历左孩子的时候,标志位为true,当遍历右孩子,则传入false,判断为叶子并且isLeft = true时,全局变量结果增加。
代码:
private int res = 0;
public int sumOfLeftLeaves(TreeNode root){
leftSum(root,false);
return res;
}
public void leftSum(TreeNode root,boolean isLeft){
if(root == null){
return;
}
if(root.left == null && root.right == null){
//叶子
if(isLeft){
//左叶子
res += root.val;
}
return;
}
leftSum(root.left,true);
leftSum(root.right,false);
}
迭代:使用栈遍历整条树,在每个结点判断是否有左叶子,增加即可。(tmp.left != null && tmp.left.left == null && tmp.left.right == null)。
代码:
public int sumOfLeftLeaves(TreeNode root) {
//迭代
int res = 0;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode tmp = stack.pop();
if(tmp.left != null && tmp.left.left == null && tmp.left.right == null){
//左叶子结点的情况
res += tmp.left.val;
}
if(tmp.left != null) stack.push(tmp.left);
if(tmp.right != null) stack.push(tmp.right);
}
return res;
}