bobo老师,关于leetcode222题

来源:7-2 一个简单的二叉树问题引发的血案 Invert Binary Tree

摇了摇头摇了摇头

2018-09-18

老师您好!! 关于您github上代码仓leetcode-222题有一些比较模糊的地方,想请教一下!
图片描述
(1 << leftRight - 1)这句算的是当前节点右子树的节点数吗?当前节点的左子树的左子树与右子树深度不相等时,说明多出来的部分就在这个左子树上( 1 << leftRight - 1 )就能把当前节点的右子树的所有节点数计算出来,之后只要递归计算左子树,再相加就能得到答案了,我的理解应该没错吧QAQ
图片描述

这两端代码的语义也就是分别算出最左边的深度和最右边的深度吧?谢谢老师!!

写回答

1回答

liuyubobobo

2018-09-18

leftHeight是计算:从一个节点出发,一直延左走的深度;

rightHeight试计算,从一个节点出发,一直延右走的深度;


你对 (1 << leftRight - 1)的理解没有错:)主体逻辑添加注释如下:

int countNodes(TreeNode* root) {    
    
    if(root == NULL)    
        return 0;    

    // 计算根节点的左孩子节点开始一直往左走的深度
    int leftLeft = leftHeight(root->left);
    
    // 计算根节点的左孩子节点开始一直往右走的深度    
    int leftRight = rightHeight(root->left);    

    // 如果左孩子节点从左走和从右走,深度一样,说明当前根节点的左子树为满二叉树
    if(leftLeft == leftRight)  
        // 返回三部分的和:  
        // 1 为当前根节点
        // (1<<leftLeft) - 1 为当前根节点的左子树(一棵满二叉树)的节点个数
        //                   注意,我们之前已经求出来了,这课满二叉树的告诉为leftLeft
        // 递归计算当前根节点右子树的节点数:countNodes(root->right)
        return 1 + ((1<<leftLeft) - 1) + countNodes(root->right);    

    // 由于是完全二叉树,如果左节点向左走和向右走高度不同,只有可能左边比右边多1
    assert(leftLeft == leftRight + 1);    
    
    // 此时,由于是完全二叉树,当前根节点的右子树的高度,肯定也是leftRight,
    // 返回三部分的和:
    // 1 为当前根节点
    // (1<<leftRight) - 1 为当前根节点的右子树(也是一棵满二叉树)的节点个数
    // 递归计算当前根节点左子树的节点数:countNodes(root->left)
    return 1 + ((1<<leftRight) - 1) + countNodes(root->left);    
}


加油!:)

3
1
摇了摇头摇了摇头
了解了!!谢谢老师!
2018-09-18
共1条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程