找树左下角的值
leetcode链接:leetcode.cn/problems/fi…
要理解题目中的左下角的节点,其实是找最大深度的叶子节点,这个叶子节点可能是左节点也可能是右节点
var findBottomLeftValue = function(root) {
let maxDeep = -Infinity;
let result;
// 要找的是最深的叶子节点,而不是最左侧的叶子节点
let dfs = (node, deep) => {
if (node.left === null && node.right === null) {
// 说明是叶子节点
if (deep > maxDeep) {
maxDeep = deep;
result = node.val;
}
return;
}
if (node.left) {
deep++;
dfs(node.left, deep);
deep--; // 回溯
}
if (node.right) {
deep++;
dfs(node.right, deep);
deep--; // 回溯
}
};
dfs(root, 1);
return result;
};
路径总和
与257. 二叉树的所有路径的思路一致,需要额外的变量存储路径之和
注意:113.路径总和ii要收集符合要求的路径的时候,js需要深拷贝数组
/**
* @param {TreeNode} root
* @param {number} targetSum
* @return {number[][]}
*/
var pathSum = function(root, targetSum) {
let result = [];
let path = [];
let sum = 0;
let dfs = (node) => {
if (!node) return;
path.push(node.val);
sum += node.val;
if (node.left === null && node.right === null) {
if (sum === targetSum) {
//需要深拷贝path
result.push([...path]);
}
path.pop();
sum -= node.val;
return;
}
dfs(node.left);
dfs(node.right);
path.pop();
sum -= node.val;
}
dfs(root);
return result;
};
构造二叉树
两道题目的思路是一致的
后序的最后一个是根节点的值,前序的第一个是根节点的值
在确定根节点的下标后,可以获得左子树的前序、后序数组和右子树的前序、后序数组,递归循环即可
注意切割数组的下标区间
var buildTree = function(inorder, postorder) {
if (!inorder.length) return null;
let rootValue = postorder.pop();
let root = new TreeNode(rootValue);
// 获取根节点元素的下标
let rootIndex = inorder.indexOf(rootValue);
// 切割中序数组
let leftInOrder = inorder.slice(0, rootIndex);
let rightInOrder = inorder.slice(rootIndex + 1);
// 切割后序数组
let leftPostOrder = postorder.slice(0, rootIndex);
let rightPostOrder = postorder.slice(rootIndex); // 不是rootIndex+1
root.left = buildTree(leftInOrder, leftPostOrder);
root.right = buildTree(rightInOrder, rightPostOrder);
return root;
};