代码随想录算法训练营第十五天 | 110.平衡二叉树、257. 二叉树的所有路径

73 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

110.平衡二叉树

题目分析

题目要求判断给定的二叉树是否是高度平衡的二叉树。首先我们需要知道什么是高度平衡的二叉树,如果一个二叉树每个结点的左右两个子数的高度差的绝对值不超过1,这个二叉树就是高度平衡的二叉树。

解决

首先来进行三要素的分析:

  1. 递归函数的参数和返回值

递归函数的参数就是传入的节点,返回值是是否为平衡二叉树.

  1. 终止条件

递归的过程中如果遇到空结点,那么就终止。返回0表示树的高度为0。

  1. 单层循环的逻辑

分别求出左子树和右子树的高度,如果差值小于或等于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. 二叉树的所有路径

题目分析

题目要求返回二叉树所有从根节点到叶子节点的路径。

解决

首先来进行三要素的分析:

  1. 递归函数的参数和返回值

参数是节点,返回值是所有路径.

  1. 终止条件

这道题的终止条件并不是当节点为空时,而是当遍历到叶子节点的时候。当节点的左子数和右子数都为空时,这个节点就是叶子节点,就可以终止.

  1. 单层循环的逻辑

将当前路径加上遍历的节点,并且进行递归调用左子树和右子树。

代码如下:

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;
};