## day16 - 二叉树part03

发布时间 2023-09-26 19:01:50作者: 笑忘书丶丶

day16 - 二叉树part03

力扣104. 二叉树的最大深度

思路:最大深度,即为顶点高度。

如果想求高度,人类思维的角度,就是从底层开始算,往上一层+1,加到顶点就是高度,也就是最大深度。

因此要用后序遍历,这样可以左右根的顺序进行遍历,从而一层一层向上返回结果,返回到根节点的时候就计算出来了最大深度

代码

class Solution {
public:

    int getHeight(TreeNode* node)
    {
        //如果节点是空,那么高度的0
        if (node == nullptr)
        {
            return 0;
        }
        //计算左孩子的高度
        int lh = getHeight(node->left);
        //计算右孩子的高度
        int rh = getHeight(node->right);
        //当前节点的高度,等于1+左右孩子最大的高度
        int height = 1 + max(lh, rh);
        return height;
    }


    int maxDepth(TreeNode* root) {
        return getHeight(root);
    }
};
力扣559. N叉树的最大深度

思路:就是把之前只有两个孩子的情况,换成for循环。遍历出最大值。

class Solution {
public:

    int getHeight(Node* node)
    {
        if (node == nullptr)
        {
            return 0;
        }
        int maxHeight = 0;
        for (int i = 0; i < node->children.size(); i++)
        {
            maxHeight = max(maxHeight, getHeight(node->children[i]));
        }
        return 1 + maxHeight;
    }


    int maxDepth(Node* root) {
        
        return getHeight(root);
    }
};
力扣222. 完全二叉树的节点个数

思路:判断二叉树是否是满二叉树,如果是,则直接使用公式2的n次方减1返回节点数量,使用位运算。

如果不是,则继续判断左右子树是否是满二叉树,直到是为止,因为叶子节点必定是慢二叉树。

代码

class Solution {
public:

    int getNum(TreeNode* node)
    {
        if (node == nullptr)
        {
            return 0;
        }
        TreeNode* left = node->left;
        TreeNode* right = node->right;
        int leftdepth = 0;
        int rightdepth = 0;
        while (left)
        {
            left = left->left;
            leftdepth++;
        }
        while(right)
        {
            right = right->right;
            rightdepth++;
        }
        if (leftdepth == rightdepth)
        {
            return (2<<leftdepth) - 1;
        }
        else
        {
            return getNum(node->left) + getNum(node->right) +1;
        }
    }

    int countNodes(TreeNode* root) {
        return getNum(root);
    }
};