代码随想录算法训练营第二十天 | 平衡二叉树 、二叉树的所有路径、左叶子之和
今天的题目,更多的是要理解二叉树的一些概念,才好做题。
平衡二叉树link
题目:给定一个二叉树,判断它是否是平衡二叉树
输入:root = [3,9,20,null,null,15,7]
输出:true
平衡二叉搜索树 :左子树和右子树的高度的绝对值不能超过1 (高度:从叶子节点到根节点)
视频推荐:代码随想录
使用递归进行求解,
递归三部曲:
1.明确递归函数的参数和返回值:int getHeight(TreeNode root)
2.明确终止条件:if (root == null) return 0;
3.明确单层递归的逻辑:
class Solution {
public boolean isBalanced(TreeNode root) {
return getHeight(root) != -1;
}
public int getHeight(TreeNode root) {
//结束条件
if (root == null)
return 0;
//单层递归的逻辑 //设定,要是不满足条件,返回-1
int leftHeight = getHeight(root.left);
if (leftHeight == -1)
return -1;
int rightHeight = getHeight(root.right);
if (rightHeight == -1)
return -1;
//左右子树高度差超过1,不满足条件
if (Math.abs(leftHeight - rightHeight) > 1) {
return -1;
}
return Math.max(leftHeight, rightHeight) + 1;//加1 是指加上当前节点
}
}
二叉树的所有路径link
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
使用递归方法。
class Solution {
List<String> ans = new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
getRes(root, "");
return ans;
}
public void getRes(TreeNode noder, String s) {
//结束条件
if (noder == null)
return;
//单层递归逻辑
if (noder.left == null && noder.right == null) {
//没有左右子树,就不加上“->”了
ans.add(new StringBuilder(s).append(noder.val).toString());
return;
}
String temp = new StringBuilder(s).append(noder.val).append("->").toString();
getRes(noder.left, temp);
getRes(noder.right, temp);
}
}
左叶子之和link
题目:给定二叉树的根节点 root ,返回所有左叶子之和。
首先理解什么是左叶子!
“左叶子”(left leaf)是指一个节点的左子节点是一个叶子节点,即该左子节点没有子节点(既没有左子节点也没有右子节点)。
文章推荐:代码随想录
根据左叶子节点的定义,我们大致有了想法,可以使用层序遍历,只当左子节点是叶子节点时才累加其值 !
class Solution {
// 层序遍历
public int sumOfLeftLeaves(TreeNode root) {
return fun(root);
}
public int fun(TreeNode root) {
if (root == null)
return 0;
int sum = 0;
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
while (!que.isEmpty()) {
int len = que.size();
while (len > 0) {
TreeNode noder = que.poll();
// 只当左子节点是叶子节点时才累加其值
if (noder.left != null && noder.left.left == null && noder.left.right == null) {
sum += noder.left.val;
que.offer(noder.left);
}
if (noder.left != null)
que.offer(noder.left);
if (noder.right != null)
que.offer(noder.right);
len--;
}
}
return sum;
}
}
希望对您有帮助。