LeetCode110.平衡二叉树
题目链接:110.平衡二叉树
思路
-
第一步,明确递归函数的参数和返回值
- 参数:为当前的节点
- 返回值:以当前节点为根节点的二叉树的高度
-
第二步,终止条件
- 当递归到该节点为空节点时,返回该节点的高度,也就是 0 。
-
第三步,单层递归逻辑
- 对于一棵平衡二叉树,如果其左右子树高度的差值
<= 1
,则该二叉树为平衡二叉树,返回当前二叉树的高度。如果> 1
,则该二叉树不是平衡二叉树,则返回 -1。
- 对于一棵平衡二叉树,如果其左右子树高度的差值
代码
class Solution {
public boolean isBalanced(TreeNode root) {
if (getHeight(root) == -1){
return false;
}
else
return true;
}
private int getHeight(TreeNode node) {
if (node == null){
return 0;
}
int leftHeight = getHeight(node.left);
if (leftHeight == -1){
return -1;
}
int rightHeight = getHeight(node.right);
if (rightHeight == -1){
return -1;
}
int result;
if (Math.abs(rightHeight - leftHeight) > 1){
result = -1;
}
else {
result = 1 + Math.max(leftHeight, rightHeight);
}
return result;
}
}
LeetCode 257. 二叉树的所有路径
题目链接:257. 二叉树的所有路径
思路
-
第一步,明确递归函数的参数和返回值
- 参数:根节点
root
,记录当前路径的path
以及结果集res
。
- 参数:根节点
-
第二步,终止条件
- 由当找到叶子节点时,即为终止条件。(对于其是否为叶子节点,即当前节点的左右叶子节点是否为
null
)
- 由当找到叶子节点时,即为终止条件。(对于其是否为叶子节点,即当前节点的左右叶子节点是否为
-
第三步,单层递归逻辑
- 进行前序遍历,对于中间节点,会先进行处理,就是将其放入到
path
中。 - 然后再进行递归和回溯的操作,如果为空就再进行递归。
- 由于要进行路径的记录,所以再每次递归的后面(回溯挨着递归),要进行一次回溯。
- 进行前序遍历,对于中间节点,会先进行处理,就是将其放入到
代码:
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);
}
}
}
LeetCode404. 左叶子之和
题目连接:404. 左叶子之和
思路
- 第一步,明确递归函数的参数和返回值
- 参数:为一棵二叉树的根节点。
- 返回值:该二叉树中左叶子之和。
- 第二步,终止条件
- 当遍历到当前节点为
null
时,其左叶子的值一定为 0,返回 0。
- 当遍历到当前节点为
- 第三步,单层递归逻辑
- 如果当前节点是左叶子节点,则将其值加入到结果中
- 通过递归求左子树的左叶子之和和右子树的左叶子之和。
- 最后将左子树的左叶子之和和右子树的左叶子之和相加,得到最终的结果。
代码
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null){
return 0;
}
if (root.left == null && root.right == null){
return 0;
}
int lefValue = sumOfLeftLeaves(root.left);
if (root.left != null && root.left.left == null && root.left.right == null){
lefValue = root.left.val;
}
int rightValue = sumOfLeftLeaves(root.right);
int sum = lefValue + rightValue;
return sum;
}
}