打卡第16天------二叉树

先放这里吧,回头我有时间的时候再给补上。

我一般周六时间充裕,在周六会把这周欠的技术债都给补上。

一、找左下角的值

leetcode题目链接:513.找树左下角的值

题目描述:

给定一个二叉树,在树的最后一行找到最左边的值。

要判断是最后一行话,其实就是深度最大的叶子节点一定是最后一行。其实就是找到深度最大的叶子节点就可以了。

解决思路:要找到深度最大的叶子节点,本题是采用前序遍历的方式,保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。

JS代码如下:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var findBottomLeftValue = function(root) {

  let maxDepth = 0;
  let result = 0;

  // 1、确定递归参数
  const fn = (node, depth) => {
    // 2、确定递归终止条件
    if (node.left == null && node.right == null) {
      if (depth > maxDepth) {
        maxDepth = depth;
        result = node;
        return;
      }
    }

    // 3、单层逻辑
    if (node.left) {
      depth++;
      fn(node.left, depth)
      depth--;
    }
    if (node.right) {
      depth++;
      fn(node.right, depth)
      depth--;
    }

  }
  fn(root, 1)

  return result.val;
};
二、路径总和

leetcode题目链接:路径总和

题目描述:

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

思路:

可以使用深度优先遍历的方式来遍历二叉树。

targetSum减去node.val等于0,且node.left为null,且node.right为null,则说明该树中存在根节点到叶子节点的路径和相加等于目标值。

来看一下具体的JS代码:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} targetSum
 * @return {boolean}
 */
//  解题思路:targetSum减去node.val等于0,且node.left为null,且node.right为null,则说明该树中存在根节点到叶子节点的路径和相加等于目标值。
let hasPathSum = function (root, targetsum) {
  // 递归法
  const traversal = (node, cnt) => {
    // 遇到叶子节点,并且计数为0
    if (cnt === 0 && !node.left && !node.right) return true;
    // 遇到叶子节点而没有找到合适的边(计数不为0),直接返回
    if (!node.left && !node.right) return false;

    //  遍历左孩子(空节点不遍历).遇到叶子节点返回true,则直接返回true
    if (node.left) {
        if (traversal(node.left, cnt - node.left.val)) {
            return true;
        }
    }
    //  遍历右孩子(空节点不遍历)
    if (node.right) {
        if (traversal(node.right, cnt - node.right.val)) {
            return true;
        }
        
    }
    return false;
  };
  if (!root) return false;
  return traversal(root, targetsum - root.val);
};
三、从中序与后序遍历序列构造二叉树

leetcode题目链接:106.从中序与后序遍历序列构造二叉树

题目描述:

根据一棵树的中序遍历与后序遍历构造二叉树。

思路:

注意找到切割点

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {number[]} inorder
 * @param {number[]} postorder
 * @return {TreeNode}
 */
var buildTree = function(inorder, postorder) {
    if (inorder?.length == 0) {
        return null;
    }
    let rootVal = postorder.pop();
    const newNode = new TreeNode(rootVal);

    let index = 0;
    for (;index < inorder.length;index++) {
        // 找到了切割点,根据这个index去切割中序数组
        if (inorder[index] == rootVal) {
            break;
        }
    }
    // let index = inorder.indexOf(rootVal);

    // 用切割点切割中序数组inorder,得到了左中序数组和右中序数组
    const lm = inorder.slice(0, index);
    const rm = inorder.slice(index + 1)
    // 用切割点切割后序数组postorder,得到了左后序数组和右后序数组
    const lb = postorder.slice(0, index);
    const rb = postorder.slice(index)
    // 构造左子树
    newNode.left = buildTree(lm, lb)
    // 构造右子树
    newNode.right = buildTree(rm, rb)

    return newNode;

};

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值