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的更多相关文章

  1. LeetCode之“树”:Balanced Binary Tree

    题目链接 题目要求: Given a binary tree, determine if it is height-balanced. For this problem, a height-balan ...

  2. LeetCode(24)-Balanced Binary Tree

    题目: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bin ...

  3. C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解

    剑指offer 面试题39:判断平衡二叉树 提交网址:  http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...

  4. LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15

    110. 平衡二叉树 110. Balanced Binary Tree 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点的左右两个子树 ...

  5. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

  6. 110.Balanced Binary Tree Leetcode解题笔记

    110.Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, ...

  7. 110. Balanced Binary Tree - LeetCode

    Question 110. Balanced Binary Tree Solution 题目大意:判断一个二叉树是不是平衡二叉树 思路:定义个boolean来记录每个子节点是否平衡 Java实现: p ...

  8. Leetcode 110 Balanced Binary Tree 二叉树

    判断一棵树是否是平衡树,即左右子树的深度相差不超过1. 我们可以回顾下depth函数其实是Leetcode 104 Maximum Depth of Binary Tree 二叉树 /** * Def ...

  9. [LeetCode] 110. Balanced Binary Tree ☆(二叉树是否平衡)

    Balanced Binary Tree [数据结构和算法]全面剖析树的各类遍历方法 描述 解析 递归分别判断每个节点的左右子树 该题是Easy的原因是该题可以很容易的想到时间复杂度为O(n^2)的方 ...

随机推荐

  1. SQL Cursor 基本用法

     1 table1结构如下  2 id    int  3 name  varchar(50)  4   5 declare @id int  6 declare @name varchar(50) ...

  2. DNS服务器的原理

    当用户去访问一个网站(百度)的时候,首先去请求dns服务器,根据对应的域名返回所在ip,然后再使用ip去访问自己所在服务器空间.简单的说,DNS服务器就像114客服,dns服务器是树状结构的,dns服 ...

  3. 在eclipse中将java导出为可执行文件.

    Ref: http://java.chinaitlab.com/Eclipse/812775.html and http://www.javavids.com/video/how-to-create- ...

  4. 详解SQL Server 2005 Express下的事件探查器

    安装Visual Studio 2008会有附带的SQL Server 2005 Express版 我们开发一般都用那个都不单独安装SQL Server的 大家都知道express版的sql是没有 事 ...

  5. 那些年,我们一起学WCF--(8)Single实例行为

    Single实例行为,类似于单件设计模式,所有可以客户端共享一个服务实例,这个服务实例是一个全局变量,该实例第一次被调用的时候初始化,到服务器关闭的时候停止. 设置服务为Single实例行为,只要设置 ...

  6. 转: Oracle AWR 报告 每天自动生成并发送邮箱

    原贴地址:http://www.cnblogs.com/vigarbuaa/archive/2012/09/05/2671794.html Oracle AWR 介绍http://blog.csdn. ...

  7. sql uniqueidentifier转varchar

    --- DECLARE @myid uniqueidentifierSET @myid = NEWID()SELECT CONVERT(char(255), @myid) AS 'char';GO-- ...

  8. C# RSA加密/解密

    RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的公钥加密算法, ...

  9. (java)从零开始之-反射Reflect

    反射: 当一个字节码文件加载到内存的时候,jvm会对该字节码进行解剖,然后会创建一个对象的Class对象,把字节码文件的信息全部都存储到该Class对象中,我们只要获取到Class对象,我们就可以使用 ...

  10. phpcms(4) V9 栏目管理

    phpcms V9框架系统后台管理之栏目管理,请参见下文的源码分析(添加栏目和修改栏目): 参照添加栏目的界面图示,便于对源代码的理解: <?php   // 文件路径:phpcms/modul ...