问题描述:给定一棵二叉树以及一个key,要求在二叉树上找一条路径,这条路径必须从根节点出发,并且路径上所有数的和等于key的值
解题思路:深度优点遍历二叉树,减治法,题目并不要求返回路径以及必须到达叶节点,所以考虑比较key与每个节点的值,如果该节点的值大于key,那么这个节点往下的路径不存在符合要求的路径;如果该节点值等于key,那么返回true;如果小于key,那么将key赋值为key减去该节点的值(key = key - node.value),然后用此时的key值与该节点的子节点数值比较。
var hasPath = (function(){
var result = false;
function judgePath(root, key){
if(result){
//存在符合要求的路径,则结束遍历
return;
}
if (root.data == key) {
result = true;
}else if(root.data < key){
key = key - root.data;
if(root.left != null){
judgePath(root.left, key);
}
if (root.right != null) {
judgePath(root.right, key);
}
}
}
return function(root,key){
result = false;
judgePath(root,key);
return result;
}
})();
//采用闭包,因为递归返回boolean值时终止条件不知道怎么写,所以用了闭包,有好的想法欢迎私信
//LeetCode要求必须是根到叶子节点,所以这个在LeetCode上面过不了
function Node(){
this.data = arguments[0];
this.left = null;
this.right = null;
}
var root = new Node(5);
var root4 = new Node(4);
var root4_2 = new Node(4);
var root13 = new Node(13);
var root8 = new Node(8);
var root11 = new Node(11);
var root7 = new Node(7);
var root2 = new Node(2);
var root1 = new Node(1);
root.left = root4;
root.right = root8;
root8.left = root13;
root8.right = root4_2;
root4.left = root11;
root11.left = root7;
root11.right = root2;
root4_2.right = root1;
alert(hasPath(root,22));//true
alert(hasPath(root,15));//false