📌  相关文章
📜  打印二叉树的每个节点中设置的位数(1)

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

打印二叉树的每个节点中设置的位数

在二叉树中,每个节点都有可能保存一些信息,包括但不限于整数、字符、布尔值、指针等等。为了将这些信息保存到节点中,在二叉树的每个节点中都有一些位被设置为了相应的信息,而这些位在每种节点类型中也是不同的。在程序中,我们可能需要打印出二叉树的每个节点中设置的位数,以便于调试和理解程序运行过程中的内部状态。本文将介绍如何实现这一功能。

实现方法

我们可以通过深度优先搜索(DFS)来遍历二叉树,累加每个节点的位数,最终输出统计结果。

具体来说,我们可以设计一个名为dfs的递归函数,该函数的输入参数为当前节点node及其所在深度depth,输出参数为当前节点中设置的位数bitCount。其中,我们可以使用C++中的位运算符号&来检查当前节点中每一个比特位是否被设置,将所有被设置的比特位的个数相加即为bitCount

dfs函数中,我们可以先递归处理当前节点的左子树和右子树,得到它们分别中设置的位数bitCountLbitCountR。然后将node中设置的位数与bitCountLbitCountR加和,就得到了当前节点总共设置的位数bitCount

代码实现

下面是C++实现的示例代码:

class Solution {
public:
    int countDigitOne(int n) {
        int count = 0;
        int factor = 1;
        int low = 0, cur = n % 10, high = n / 10;
        while (high > 0 || cur > 0) {
            if (cur == 0) {
                count += high * factor;
            } else if (cur == 1) {
                count += high * factor + low + 1;
            } else {
                count += (high + 1) * factor;
            }
            low += cur * factor;
            cur = high % 10;
            high /= 10;
            factor *= 10;
        }
        return count;
    }
};
测试示例

下面给出一些测试示例:

int main() {
    Solution solution;
    cout << solution.countDigitOne(13) << endl;  // expects 6
    cout << solution.countDigitOne(0) << endl;  // expects 0
    cout << solution.countDigitOne(10) << endl;  // expects 2
    cout << solution.countDigitOne(111) << endl;  // expects 36
    return 0;
}
时间复杂度

由于我们只需要遍历一遍二叉树,所以时间复杂度为$O(n)$,其中$n$为二叉树中节点的个数。

空间复杂度

由于递归深度不超过树高,所以空间复杂度为$O(h)$,其中$h$为二叉树的高度。