📌  相关文章
📜  教资会网络 | UGC NET CS 2017 年 1 月至 2 日 |问题 50(1)

📅  最后修改于: 2023-12-03 15:39:55.516000             🧑  作者: Mango

UGC NET CS 2017 年 1 月至 2 日 |问题 50

简介

UGC NET CS 2017年1月至2月的50号问题涉及到二叉树的节点计数问题。该问题可让程序员进一步了解二叉树的特性和算法优化。

问题描述

给定一棵二叉树,需要计算节点的数量。如果二叉树为空,则节点数量为0。

解决方案

二叉树的节点数可通过递归算法进行计算,该算法的时间复杂度为O(n),其中n表示节点数量。

实现代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        if (root == NULL) {
            return 0;
        }
        return 1 + countNodes(root->left) + countNodes(root->right);
    }
};
算法优化

该问题还有一种更加高效的算法,使用了完全二叉树的性质,其时间复杂度为O(logn*logn)。

代码片段如下:

class Solution {
public:
    int countNodes(TreeNode* root) {
        if (root == NULL) {
            return 0;
        }
        int height = 0;
        TreeNode *node = root;
        while (node != NULL) {
            height++;
            node = node->left;
        }
        int left = 1 << (height - 1), right = (1 << height) - 1;
        while (left < right) {
            int mid = (right - left + 1) / 2 + left;
            if (isExist(root, height, mid)) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }
    
    bool isExist(TreeNode* root, int height, int k) {
        int bit = 1 << (height - 2);
        while (root != NULL && bit > 0) {
            if (bit & k) {
                root = root->right;
            } else {
                root = root->left;
            }
            bit >>= 1;
        }
        return root != NULL;
    }
};
总结

掌握二叉树节点计数的算法,能让程序员更深入理解二叉树。其中递归算法的时间复杂度较高,需要通过算法优化进行提高。