513. 找树左下角的值
第一眼感觉用层序遍历会很简单
var findBottomLeftValue = function(root) {
let queue = [root]
let res = root.val
while(queue.length > 0){
let size = queue.length
res = queue[0].val
for(let i=0;i<size;i++){
let node = queue.shift()
if(node.left) queue.push(node.left)
if(node.right) queue.push(node.right)
}
}
return res
};
递归就比较难了
var findBottomLeftValue = function(root) {
//首先考虑递归遍历 前序遍历 找到最大深度的叶子节点即可
let maxPath = 0, resNode = null;
// 1. 确定递归函数的函数参数
const dfsTree = function(node, curPath) {
// 2. 确定递归函数终止条件
if(node.left === null && node.right === null) {
if(curPath > maxPath) {
maxPath = curPath;
resNode = node.val;
}
}
node.left && dfsTree(node.left, curPath+1);
node.right && dfsTree(node.right, curPath+1);
}
dfsTree(root,1);
return resNode;
};
112. 路径总和
递归回溯,挺简单的
var hasPathSum = function(root, targetSum) {
let res = false
var fn = (root,num) => {
if(!root) return
if(root && !root.left && !root.right){
if(num + root.val === targetSum){
res = true
}
}
fn(root.left,num + root.val)
fn(root.right,num + root.val)
}
fn(root,0)
return res
};
113. 路径总和 II
var pathSum = function(root, targetSum) {
let res = []
let fn = (root,numArr) => {
if(!root) return
if(root && !root.left && !root.right){
let temp = [...numArr,root.val]
if(temp.reduce((acc,cur)=>{
return acc + cur
},0) === targetSum){
res.push(temp)
}
return
}
fn(root.left,[...numArr,root.val])
fn(root.right,[...numArr,root.val])
}
fn(root,[])
return res
};
106. 从中序与后序遍历序列构造二叉树
这是自己写的第一版,虽然一遍过了,但是差点超时
var buildTree = function(inorder, postorder) {
if(inorder.length === 1){
return new TreeNode(inorder[0])
}else if(inorder.length === 0){
return null
}
let root = postorder.pop()
let rootIndex = inorder.indexOf(root)
let leftIn = inorder.slice(0,rootIndex)
let rightIn = inorder.slice(rootIndex+1)
let leftPo = postorder.slice(0,leftIn.length)
let rightPo = postorder.slice(leftIn.length)
return new TreeNode(root,buildTree(leftIn,leftPo),buildTree(rightIn,rightPo))
};
105. 从前序与中序遍历序列构造二叉树
前序和中序和上一题的思路一样
var buildTree = function(preorder, inorder) {
if(preorder.length === 0) return null
let node = preorder.shift()
let nodeIndex = inorder.indexOf(node)
let leftIn = inorder.slice(0,nodeIndex)
let rightIn = inorder.slice(nodeIndex+1)
let leftPre = preorder.slice(0,leftIn.length)
let rightPre = preorder.slice(leftIn.length)
return new TreeNode(node,buildTree(leftPre,leftIn),buildTree(rightPre,rightIn))
};