2024华为OD试题及答案-A069-创建二叉树

题目描述

请按下列描述构建一颗二叉树,并返回该树的根节点:

1、先创建值为-1的根结点,根节点在第0层;

2、然后根据operations依次添加节点: operations[i] = [height, index] 表示对第 height 层的第index 个节点node, 添加值为 i 的子节点:

  • 若node 无「左子节点」,则添加左子节点;
  • 若node 有「左子节点」,但无「右子节点」,则添加右子节点;
  • 否则不作任何处理。

height、index 均从0开始计数;

index 指所在层的创建顺序。

注意:

  • 输入用例保证每次操作对应的节点已存在;
  • 控制台输出的内容是根据返回的树根节点,按照层序遍历二叉树打印的结果。

输入描述

operations

输出描述

根据返回的树根节点,按照层序遍历二叉树打印的结果

备注
  • 1 <= operations.length <= 100
  • operations[i].length == 2
  • 0 <= operations[i][0] < 100
  • 0 <= operations[i][1] < 100

用例
输入[[0, 0], [0, 0], [1, 1], [1, 0], [0, 0]]
输出[-1, 0, 1, 3, null, 2]
说明

首个值是根节点的值,也是返回值;

null 表示是空节点,此特殊层序遍历会遍历有值节点的 null 子节点

输入[[0, 0], [1, 0], [1, 0], [2, 1], [2, 1], [2, 1], [2, 0], [3, 1], [2, 0]]
输出[-1, 0, null, 1, 2, 6, 8, 3, 4, null, null, null, null, null, null, 7]
说明

首个值是根节点的值,也是返回值;

null 表示是空节点,此特殊层序遍历会遍历有值节点的 null 子节点

解题思路分析

这道题目要求我们根据一系列的操作构建一棵二叉树,并在构建完成后,输出该树的层序遍历结果。我们可以通过以下步骤来解决这个问题:

  1. 树的结构定义

    • 首先定义树的节点结构,每个节点有一个值和指向左右子节点的指针。
  2. 树的构建

    • 初始化根节点,根节点的值为1。
    • 根据给定的 operations,依次向树中添加节点。每个操作由两个参数组成:heightindex,分别表示在树的第 height 层的第 index 个节点上,添加一个新的子节点。我们需要按顺序判断并添加新的节点。
  3. 层序遍历

    • 在树构建完成后,使用层序遍历(广度优先搜索)的方法输出树的节点值。
  4. 注意事项

    • 每次操作中的 heightindex 都确保节点存在,因此我们不需要额外检查。
    • 添加子节点时,如果左右子节点都存在,则不进行任何操作。

C++ 代码实现

 
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

void levelOrder(TreeNode* root) {
    if (!root) return;

    queue<TreeNode*> q;
    q.push(root);

    while (!q.empty()) {
        TreeNode* node = q.front();
        q.pop();
        cout << node->val << " ";
        if (node->left) q.push(node->left);
        if (node->right) q.push(node->right);
    }
    cout << endl;
}

int main() {
    vector<vector<int>> operations = {
        {0, 0}, {1, 0}, {1, 0}, {2, 0}, {2, 1}, {2, 1}
    };

    vector<TreeNode*> levels[100];
    TreeNode* root = new TreeNode(1);
    levels[0].push_back(root);

    for (int i = 0; i < operations.size(); ++i) {
        int height = operations[i][0];
        int index = operations[i][1];
        TreeNode* node = levels[height][index];

        TreeNode* newNode = new TreeNode(i + 2);
        if (!node->left) {
            node->left = newNode;
        } else if (!node->right) {
            node->right = newNode;
        }
        levels[height + 1].push_back(newNode);
    }

    levelOrder(root);

    return 0;
}

Python 代码实现

 
from collections import deque

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def level_order(root):
    if not root:
        return
    queue = deque([root])
    while queue:
        node = queue.popleft()
        print(node.val, end=" ")
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)
    print()

def main():
    operations = [
        [0, 0], [1, 0], [1, 0], [2, 0], [2, 1], [2, 1]
    ]
    
    levels = [[] for _ in range(100)]
    root = TreeNode(1)
    levels[0].append(root)

    for i, op in enumerate(operations):
        height, index = op
        node = levels[height][index]

        new_node = TreeNode(i + 2)
        if not node.left:
            node.left = new_node
        elif not node.right:
            node.right = new_node
        levels[height + 1].append(new_node)

    level_order(root)

if __name__ == "__main__":
    main()

解题说明

  1. 树的节点结构:使用类或结构体来定义树节点的基本结构,包括节点值、左子节点和右子节点。

  2. 操作解析:遍历 operations 列表,根据指定的层数和索引找到当前节点,判断是否可以添加左或右子节点,并将新节点添加到对应的位置。

  3. 层序遍历:在树构建完成后,使用队列进行广度优先遍历,依次输出每一层的节点值。

这段代码可以很好地解决题目中的问题,通过维护一个 levels 数组来存储各层节点的指针,从而能够根据 heightindex 快速找到指定的节点,并完成节点的添加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值