Day15:二叉树基础 |||

110.平衡二叉树 

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

function isBalanced(root: TreeNode | null): boolean {
    let isBalance = true;
    function traverse(root: TreeNode | null, level: number){
        if(!root) return level;
        level++;
        let leftLevel = traverse(root.left, level);
        let rightLevel = traverse(root.right, level);
        if(Math.abs(leftLevel - rightLevel) > 1) isBalance = false;
        return Math.max(leftLevel, rightLevel);
    }
    traverse(root, 0);
    return isBalance;
};

官方题解:不用 isBalance 变量,如果不满足条件,直接返回 -1,并且就不继续后面的递归了

// 递归法
function isBalanced(root: TreeNode | null): boolean {
    function getDepth(root: TreeNode | null): number {
        if (root === null) return 0;
        let leftDepth: number = getDepth(root.left);
        if (leftDepth === -1) return -1;
        let rightDepth: number = getDepth(root.right);
        if (rightDepth === -1) return -1;
        if (Math.abs(leftDepth - rightDepth) > 1) return -1;
        return 1 + Math.max(leftDepth, rightDepth);
    }
    return getDepth(root) !== -1;
};

257. 二叉树的所有路径 


function binaryTreePaths(root: TreeNode | null): string[] {
    let results = [];
    let helperStack = [];
    function traverse(root: TreeNode | null){
        if(!root) return;
        helperStack.push(root.val);
        if(!root.left && !root.right){
            results.push([...helperStack]);
            helperStack.pop();
            return;
        }
        traverse(root.left);
        traverse(root.right);
        helperStack.pop();
        return;
    }
    traverse(root);
    return results.map(result => result.join('->'));
};

404.左叶子之和 

function sumOfLeftLeaves(root: TreeNode | null): number {
    function traverse(root: TreeNode | null, isLeftNode: boolean) {
        if (!root) return 0;
        if (isLeftNode && !root.left && !root.right)
            return root.val;
        let leftSum = traverse(root.left, true);
        let rightSum = traverse(root.right, false);
        return leftSum + rightSum;
    }
    return traverse(root, false);
};

222.完全二叉树的节点个数(需要回看)

普通二叉树的求法:

function countNodes(root: TreeNode | null): number {
    function traverse(root: TreeNode | null){
        if(!root) return 0;
        let leftSum = traverse(root.left);
        let rightSum = traverse(root.right);
        return 1 + leftSum + rightSum;
    }
    return traverse(root);
};

完全二叉树:

在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1)  个节点。

完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。

对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。

对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。

这里关键在于如何去判断一个左子树或者右子树是不是满二叉树呢?

在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。

在完全二叉树中,如果递归向左遍历的深度不等于递归向右遍历的深度,则说明不是满二叉树

官方题解:

function countNodes(root: TreeNode | null): number {
    if (root === null) return 0;
    let left: number = 0,
        right: number = 0;
    let curNode: TreeNode | null= root;
    while (curNode !== null) {
        left++;
        curNode = curNode.left;
    }
    curNode = root;
    while (curNode !== null) {
        right++;
        curNode = curNode.right;
    }
    if (left === right) {
        return 2 ** left - 1;
    }
    return 1 + countNodes(root.left) + countNodes(root.right);
};

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值