小红的二叉树构造

[题目链接](https://www.nowcoder.com/practice/f798461d82c94959a1922efda1dd05eb)

思路

要构造一棵 层的满二叉树,使得每一层的节点权值和都相等。

关键观察:第 层(从 开始计数)有 个节点。设每层权值和为 ,则第 层每个节点的平均权值为 。为了让所有节点权值都是正整数, 必须是 的倍数(因为最后一层有 个节点)。

最简单的构造方案:取 ,则第 层的每个节点权值为

  • 层(根节点):权值为
  • 层:每个节点权值为
  • ...
  • 层(叶子层):每个节点权值为

这样每一层的权值和都是 ,满足条件。

样例演示

输入

  • 层:(和 =
  • 层:(和 =
  • 层:(和 =

输出 {4,2,2,1,1,1,1},是一个合法解。题目示例的 {5,2,3,1,2,1,1} 也是合法解,有多解时返回任意一个即可。

代码

class Solution {
public:
    TreeNode* create(int n) {
        return build(0, n);
    }

    TreeNode* build(int level, int n) {
        if (level >= n) return nullptr;
        int val = 1 << (n - 1 - level);
        TreeNode* node = new TreeNode(val);
        node->left = build(level + 1, n);
        node->right = build(level + 1, n);
        return node;
    }
};
import java.util.*;

public class Solution {
    public TreeNode create (int n) {
        return build(0, n);
    }

    private TreeNode build(int level, int n) {
        if (level >= n) return null;
        int val = 1 << (n - 1 - level);
        TreeNode node = new TreeNode(val);
        node.left = build(level + 1, n);
        node.right = build(level + 1, n);
        return node;
    }
}

复杂度分析

  • 时间复杂度。需要构造满二叉树的所有节点,共 个。
  • 空间复杂度。存储整棵满二叉树需要 个节点,递归栈深度为