[LeetCode#110, 112, 113]Balanced Binary Tree, Path Sum, Path Sum II
Problem 1 [Balanced Binary Tree]
Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
Problem 2 [Path Sum]
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.
For example:
Given the below binary tree and sum = 22
,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
Problem 3 [Path Sum II]
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
For example:
Given the below binary tree and sum = 22
,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
The three problems are very easy at some extent, but they differ with each other, regarding the proper mechanism of passing answer set and arguments.
The three problems include two very important issues in writing a recursion program.
1. How to pass the arguments to next level recursion?
2. How to return the answer set?
In problem1: (feedback to root level)
In order to test if a tree is a balance binary tree, we need to get the height of left-sub tree and right-sub tree. Can we do it in this way ?
get_height(..., int left_tree_height, ...)
Absolutely no, Java pass arguments by value(the change in low-level recursion is just within its own scope).Thus we have to use other choices.
Choice 1: Record the height in an array(ArrayList), but we have only one height value to pass between two adjacent recursion levels. It seems to complex the problem.
Choice 2: Return height as a return value. It seems very reasonable, but how could we pass the vlidation information back(we check along the recursion path). We have already use height as return value, we can't return a boolean value at the same time. There is a way to solve this problem: Since we pass height, and the height would never be a negative number, how about using "-1" to indicate invalidation.
My solution:
public class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) //an empty tree
return true; if (getTreeHeight(root) == -1)
return false;
else
return true;
} private int getTreeHeight(TreeNode cur_root) { if (cur_root == null)
return 0; int left_height = getTreeHeight(cur_root.left);
int right_height = getTreeHeight(cur_root.right); if (left_height == -1 || right_height == -1) //the -1 represent violation happens in the sub-tree
return -1; if (Math.abs(left_height - right_height) > 1) //the violation happens in the current tree
return -1; return left_height > right_height ? left_height + 1 : right_height + 1;
//return the new height to the pre level recursion
}
}
In problem 2: (feedback to root level)
Since we just care about whether there exists an path equal to the sum, we could directly use a boolean value as return value.
My solution:
public class Solution {
public boolean hasPathSum(TreeNode root, int sum) { if (root == null)
return false; return helper(root, sum);
} private boolean helper(TreeNode cur_root, int sub_sum) { if (cur_root == null)
return false; if (cur_root.left == null && cur_root.right == null) { //reach the leaf node
if (cur_root.val == sub_sum)
return true;
} return helper(cur_root.left, sub_sum - cur_root.val) || helper(cur_root.right, sub_sum - cur_root.val);
}
}
In problem 3:(no need to feed back to root level, directly add answer to result set at base level)
This problem is an advanced version of problem3, it includes many skills we should master when writing an useful recursion program. We should first note following facts:
1. we need a global answer set, thus once we have searched out a solution, we could directly add the solution into the answer set. The effects scope of this set should be globally accessiable. This means at each recursion branches, it could be updated, and the effects is in global scope. We pass it as an argument.
public ArrayList<ArrayList<Integer>> pathSum(TreeNode root, int sum) { ArrayList<ArrayList<Integer>> ret = new ArrayList<ArrayList<Integer>> ();
if (root == null)
return ret; ArrayList<Integer> ans = new ArrayList<Integer> ();
helper(root, sum, ans ,ret); return ret;
}
2. We should keep the path's previous information before reaching the current node. We should be able to mainpulate on the information, and pass it to next recursion level. The big problem comes out : if we manipulate on the same object(list), this could be a disaster. Since each recursion level has two sparate searching branches.
The solution: we make a copy of passed in list, thus we can use the information recorded in the list, without affecting other searching branches. <All we want to get and use is the information, not the list>
ArrayList<Integer> left_ans_copy = new ArrayList<Integer> (ans);
ArrayList<Integer> right_ans_copy = new ArrayList<Integer> (ans);
My solution:
public class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) //an empty tree
return true; if (getTreeHeight(root) == -1)
return false;
else
return true;
} private int getTreeHeight(TreeNode cur_root) { if (cur_root == null)
return 0; int left_height = getTreeHeight(cur_root.left);
int right_height = getTreeHeight(cur_root.right); if (left_height == -1 || right_height == -1) //the -1 represent violation happens in the sub-tree
return -1; if (Math.abs(left_height - right_height) > 1) //the violation happens in the current tree
return -1; return left_height > right_height ? left_height + 1 : right_height + 1;
//return the new height to the pre level recursion
}
}
[LeetCode#110, 112, 113]Balanced Binary Tree, Path Sum, Path Sum II的更多相关文章
- LeetCode之“树”:Balanced Binary Tree
题目链接 题目要求: Given a binary tree, determine if it is height-balanced. For this problem, a height-balan ...
- LeetCode(24)-Balanced Binary Tree
题目: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bin ...
- C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
剑指offer 面试题39:判断平衡二叉树 提交网址: http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...
- LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15
110. 平衡二叉树 110. Balanced Binary Tree 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点的左右两个子树 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- 110.Balanced Binary Tree Leetcode解题笔记
110.Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, ...
- 110. Balanced Binary Tree - LeetCode
Question 110. Balanced Binary Tree Solution 题目大意:判断一个二叉树是不是平衡二叉树 思路:定义个boolean来记录每个子节点是否平衡 Java实现: p ...
- Leetcode 110 Balanced Binary Tree 二叉树
判断一棵树是否是平衡树,即左右子树的深度相差不超过1. 我们可以回顾下depth函数其实是Leetcode 104 Maximum Depth of Binary Tree 二叉树 /** * Def ...
- [LeetCode] 110. Balanced Binary Tree ☆(二叉树是否平衡)
Balanced Binary Tree [数据结构和算法]全面剖析树的各类遍历方法 描述 解析 递归分别判断每个节点的左右子树 该题是Easy的原因是该题可以很容易的想到时间复杂度为O(n^2)的方 ...
随机推荐
- Android群英传》读书笔记 (4) 第八章 Activity和Activity调用栈分析 + 第九章 系统信息与安全机制 + 第十章 性能优化
第八章 Activity和Activity调用栈分析 1.Activity生命周期理解生命周期就是两张图:第一张图是回字型的生命周期图第二张图是金字塔型的生命周期图 注意点(1)从stopped状态重 ...
- shell入门之流程控制语句 分类: 学习笔记 linux ubuntu 2015-07-10 16:38 89人阅读 评论(0) 收藏
1.case 脚本: #!/bin/bash #a test about case case $1 in "lenve") echo "input lenve" ...
- APP切图那些事儿-Android ios
- javascript中的简单三角函数
- spring 定时任务的 执行时间设置规则
单纯针对时间的设置规则org.springframework.scheduling.quartz.CronTriggerBean允许你更精确地控制任务的运行时间,只需要设置其cronExpressio ...
- codevs 1519 过路费 最小生成树+倍增
/*codevs 1519 过路费 最小生成树+倍增*/ #include<iostream> #include<cstdio> #include<cstring> ...
- 不能错过的XCode插件
以便自己记忆网上找的! 以下是搜集的一些有力的XCode插件. 全能搜索家CodePilot 2.0 你要找的是文件?是文件夹?是代码?Never Mind,CMD+SHIFT+X调出CodePilo ...
- 添加Pods后,import无提示的解决办法
选择工程的 Target -> Build Settings 菜单,找到\”User Header Search Paths\”设置项 新增一个值"$(PODS_ROOT)" ...
- servlet的提交
servlet的提交和动态改变有点依赖xml 我们点击控件的时候改变了里面的变量,改变了xml,servlet发现变量变了,就会刷新页面 如果xml文档没有更新,浏览器采用缓存而不则行 <for ...
- SGU 137.Funny String
题目描述 一个序列S1 S2 S3... Sn 如果满足 新序列 S1-1 S2 S3 ...Sn+1能够通过旋转的操作(不是翻转)来得到旧的序列,那么这个序列就叫做Funny序列.例如 1 2 1 ...