题一:平衡二叉树
题目链接: 平衡二叉树
解题思路: 平衡二叉树就是在二叉树里的任何一个节点的左右子树的高度差不能超过1。这里我们使用后序。
解题代码:
var isBalanced = function (root) {
let getHeight = function (node) {
if (!node) return 0;
// 处理左子树
let left_height = getHeight(node.left);
// 处理右子树
let right_height = getHeight(node.right);
let result = 0;
if(left_height === -1)return -1;
if(right_height === -1)return -1;
if (Math.abs(right_height - left_height) > 1) {
result = -1
} else {
result = 1 + Math.max(right_height, left_height);
}
return result;
}
return getHeight(root) === -1 ? false : true;
};
题二:二叉树的所有路径
题目链接: 二叉树的所有路径
解题思路: 我们在这里使用前序遍历,只有前序遍历,父节点指向孩子节点,才能把路径保存起来,这里还涉及到了回溯的过程。
解题代码:
var binaryTreePaths = function(root) {
let traversal = function(node,path,result){
path.push(node.val);
if(!node.left && !node.right){
result.push(path.join('->'));
return;
}
if(node.left){
traversal(node.left,path,result);
path.pop();
}
if(node.right){
traversal(node.right,path,result);
path.pop();
}
}
let result = [];
let path = [];
traversal(root,path,result);
return result;
};
题三:左叶子节点值之和
题目链接: 左叶子节点值之和
解题思路: 先把左子树的左叶子节点的值收集到,再把右子树的左叶子节点的值收集到,然后相加再返回,这就是整体思路。
解题代码:
var sumOfLeftLeaves = function (root) {
let traversal = function(node){
if(!node)return 0;
if(!node.left && !node.right)return 0;
// 左
let leftNum = traversal(node.left);
if(node.left && !node.left.left && !node.left.right){
leftNum = node.left.val;
}
// 右
let rightNum = traversal(node.right);
let sum = leftNum + rightNum;
return sum;
}
return traversal(root);
}