二叉树与彻底二叉树计算节点数

二叉树与彻底二叉树计算节点数

这是一个刷题博客,记录leetcode上关于二叉树栏目的刷题题解。node

二叉树的节点数(leetcode 222)

题目描述:彻底二叉树的节点个数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

算法分析与设计

思路 1

若是没有 “彻底二叉树” 这个条件,那么就用通常的,二叉树计算节点数的方法来作。考虑深度优先遍历,每一颗二叉树均可以由其根节点、左子树、右子树组成。考虑这个递归模式,从根节点开始计算,而后每一轮都带上该子树的根节点,直到叶子节点的时候,就只有一个节点了!此时,节点个数就计算完成!算法

思路 2

彻底二叉树的概念,是只有最后一层不满,而前 n − 1 n-1 n−1 层都是满二叉树,对于满二叉树,它的节点个数为 2 h − 1 2^{h}-1 2h−1,其中: h = n − 1 h=n-1 h=n−1。ide

因而,当前二叉树只有两种可能性:spa

  1. 是彻底二叉树,用上述公式计算;
  2. 不是彻底二叉树,可是其子树有多是彻底二叉树,而且叶子节点确定是彻底二叉树,因而进行递归,计算左右子树;

《思路 1》的AC代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
private:
    void dfs(int& cnt, TreeNode*& root) {
        if (!root)
            return ;
        cnt++;
        dfs(cnt, root->left);
        dfs(cnt, root->right);
    }
public:
    int countNodes(TreeNode* root) {
        int res = 0;
        dfs(res, root);
        return res;
    }
};

《思路 2》的AC代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        int res = 0;
        if (!root)
            return res;
        int lh = 0, rh = 0;
        TreeNode* lr = root;
        TreeNode* rr = root;
        while (lr) {
            lh++;
            lr = lr->left;
        }
        while (rr) {
            rh++;
            rr = rr->right;
        }
        if (lh == rh)
            res = ((1 << lh) - 1);
        else
            res = 1 + countNodes(root->left) + countNodes(root->right);
        return res;
    }
};

经过记录

在这里插入图片描述

相关文章
相关标签/搜索