我与LeetCode的50天之JavaScript实现

本文详细介绍了二叉树的深度求解、从上向下打印及寻找特定路径的算法实现,通过递归与迭代方法深入解析二叉树操作的核心技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

first day:

  • **

求二叉树的深度

**:描述:
// 输入一棵二叉树,求该树的深度。
// 从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,
// 最长路径的长度为树的深度。

知识点:

  1. 节点的左右孩子节点表示为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;
    }
}

注意事项:

  1. pRoot节点的判空处理

参考链接:
二叉树深度-js实现

  • **

从上向下打印二叉树

**
// 从上往下打印出二叉树的每个节点,同层节点从左至右打印。

知识点:

  1. List item

思路解析:

  1. 将二叉树上已被遍历过的节点都存在队列queue中;
  2. 只要queue的长度不为0,就不停shift出队首的节点,存到result中;
  3. 输出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;
}

注意事项:

  1. 根节点root的判空处理;
  2. while循环条件用的是queue.length 而非queue
  3. 获取节点的值用的是node.val,而非node.value. val是jQuery的实现方法

参考链接:
从上往下打印二叉树-js实现
.val()与.value的区别
js中innerText/value/innerHTML三个属性的区别

二叉树中和为某一值的路径

描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

实现思路

  1. 定义一个方法专门用于遍历二叉树
  2. 先序遍历二叉树,每遍历一个节点,把节点加到路径path中,同时将它的值node.val加到currentSum中;
  3. 当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();
}

注意事项

  1. currentSum中添加的是node.val 而非node
  2. path中添加的也是node.val 而非node

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值