先放这里吧,回头我有时间的时候再给补上。
我一般周六时间充裕,在周六会把这周欠的技术债都给补上。
一、找左下角的值
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;
};