代码随想录算法训练营第十五天| 110.平衡二叉树、 257. 二叉树的所有路径 、404.左叶子之和 、 222.完全二叉树的节点个数

58 阅读1分钟

110.平衡二叉树

相关链接:题目链接文章讲解 视频讲解

解题思路

求二叉树的高度,用后序遍历

平衡二叉树即:每个节点的左右子树的高度差不能大于1

代码实现

var isBalanced = function(root) {
    var getHeight = function(root){
        if(!root) { return 0;}
        var leftH = (root.left && getHeight(root.left)) || 0;
        if(leftH === -1){
            return -1;
        }
        var rightH = (root.right && getHeight(root.right)) || 0;
        if(rightH === -1){
            return -1;
        }
        if(Math.abs(leftH - rightH) > 1){
            return -1;
        }else{
            return 1 + Math.max(leftH,rightH);
        }
    }
    var h = getHeight(root);
    if(h === -1){
        return false;
    }else{
        return true;
    }
};

257. 二叉树的所有路径

相关链接:题目链接文章讲解 视频讲解

解题思路

求到叶子结点的路径,用前序遍历

代码实现

var binaryTreePaths = function(root) {
    if(!root) return [];
     var result =[]; 
     var dfs = function(root,path){
            if(root){
                path += root.val;
                if(root && root.left === null && root.right === null){
                    result.push(path);
                }else{
                    path +='->';
                    dfs(root.left,path);
                    dfs(root.right,path);
                }
            }
        }
    dfs(root,'');
    return result;
};

404.左叶子之和

相关链接:题目链接文章讲解 视频讲解

解题思路

求左叶子结点之和,先序遍历,找到所有的叶子节点

左叶子结点,则父级的左指针指向该叶子节点

代码实现

var sumOfLeftLeaves = function(root) {
    var sum =0;
    var dfs= function(bt,p){
        if(bt && !bt.left && !bt.right){
            p && (p.left === bt) && (sum += bt.val);
        }
        bt.left && dfs(bt.left,bt);
        bt.right && dfs(bt.right,bt);
    }
    dfs(root);
    return sum;
};

222.完全二叉树的节点个数

相关链接:题目链接文章讲解 视频讲解

解题思路

代码实现

var countNodes = function(root) {
    var sum =0;
    var dfs = function(node){
        if(!node) return sum;
        sum+=1;
        node.left && dfs(node.left);
        node.right && dfs(node.right);
    }
    dfs(root);
    return sum;
}