first day:
- **
求二叉树的深度
**:描述:
// 输入一棵二叉树,求该树的深度。
// 从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,
// 最长路径的长度为树的深度。
知识点:
- 节点的左右孩子节点表示为node.left node.right
递归方法实现
function TreeDepth(pRoot)
{
// 参考实现为:https://blog.youkuaiyun.com/romeo12334/article/details/81220264
if(pRoot===null) {
return 0;
} else {
var leftDep = TreeDepth(pRoot.left);
var rightDep = TreeDepth(pRoot.right);
var maxDep = leftDep > rightDep ? leftDep : rightDep;
return maxDep + 1;
}
}
注意事项:
- pRoot节点的判空处理
参考链接:
二叉树深度-js实现
- **
从上向下打印二叉树
**
// 从上往下打印出二叉树的每个节点,同层节点从左至右打印。
知识点:
- List item
思路解析:
- 将二叉树上已被遍历过的节点都存在队列queue中;
- 只要queue的长度不为0,就不停shift出队首的节点,存到result中;
- 输出result中的数值。
function PrintFromTopToBottom(root)
{
// 参考实现为https://www.jianshu.com/p/d660dbf4c8fe
var queue = [];
queue.push(root);
var result = [];
if (root === null) {
return result;
}
while(queue.length) {
var temp = queue.shift();
result.push(temp.val); // attention 此处为val 不是value
if (temp.left) {
queue.push(temp.left);
}
if (temp.right) {
queue.push(temp.right);
}
}
return result;
}
注意事项:
- 根节点root的判空处理;
- while循环条件用的是queue.length 而非queue
- 获取节点的值用的是node.val,而非node.value. val是jQuery的实现方法
参考链接:
从上往下打印二叉树-js实现
.val()与.value的区别
js中innerText/value/innerHTML三个属性的区别
二叉树中和为某一值的路径
描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
实现思路
- 定义一个方法专门用于遍历二叉树
- 先序遍历二叉树,每遍历一个节点,把节点加到路径path中,同时将它的值node.val加到currentSum中;
- 当currentSum===expectNumber,且无左右孩子节点时,将该路径存到result中;
实现
function FindPath(root, expectNumber)
{
var result = [];
if(root === null) {
return result;
}
dfsFind(root,expectNumber,[],0,result);
return result;
}
function dfsFind(root, expectNumber, path, currentSum, result) {
currentSum += root.val;
path.push(root.val);
if (currentSum == expectNumber && root.left == null && root.right == null) {
result.push(path.slice(0));
}
if (root.left !== null) {
dfsFind(root.left,expectNumber,path,currentSum,result);
}
if(root.right !== null) {
dfsFind(root.right,expectNumber,path,currentSum,result);
}
path.pop();
}
注意事项
- currentSum中添加的是node.val 而非node
- path中添加的也是node.val 而非node
参考链接