持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
110.平衡二叉树
题目分析
题目要求判断给定的二叉树是否是高度平衡的二叉树。首先我们需要知道什么是高度平衡的二叉树,如果一个二叉树每个结点的左右两个子数的高度差的绝对值不超过1,这个二叉树就是高度平衡的二叉树。
解决
首先来进行三要素的分析:
- 递归函数的参数和返回值
递归函数的参数就是传入的节点,返回值是是否为平衡二叉树.
- 终止条件
递归的过程中如果遇到空结点,那么就终止。返回0表示树的高度为0。
- 单层循环的逻辑
分别求出左子树和右子树的高度,如果差值小于或等于1,则返回当前二叉树的高度,否则返回-1,表示该二叉数不是二叉平衡树。
代码如下:
var isBalanced = function(root) {
const getDepth = function(root) {
if(root === null) return 0;
let left = getDepth(root.left)
if(left === -1) return -1;
let right = getDepth(root.right)
if(right === -1) return -1;
if(Math.abs(left - right) > 1) {
return -1;
} else {
return 1 + Math.max(left,right)
}
}
return !(getDepth(root) === -1)
};
上面代码,值得注意的是,如果左子树返回-1,那么左子树就不是平衡二叉树,那么整一个阿尔法数,也不是平衡二叉树了。右子树同理。
257. 二叉树的所有路径
题目分析
题目要求返回二叉树所有从根节点到叶子节点的路径。
解决
首先来进行三要素的分析:
- 递归函数的参数和返回值
参数是节点,返回值是所有路径.
- 终止条件
这道题的终止条件并不是当节点为空时,而是当遍历到叶子节点的时候。当节点的左子数和右子数都为空时,这个节点就是叶子节点,就可以终止.
- 单层循环的逻辑
将当前路径加上遍历的节点,并且进行递归调用左子树和右子树。
代码如下:
var binaryTreePaths = function(root) {
let res=[];
const getPath=function(node,curPath){
if(node.left===null&&node.right===null){
curPath+=node.val;
res.push(curPath);
return ;
}
curPath+=node.val+'->';
node.left&&getPath(node.left,curPath);
node.right&&getPath(node.right,curPath);
}
getPath(root,'');
return res;
};