news 2026/6/25 9:38:46

leetcode 2196. 根据描述创建二叉树 中等

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
leetcode 2196. 根据描述创建二叉树 中等

给你一个二维整数数组descriptions,其中descriptions[i] = [parenti, childi, isLefti]表示parentichildi二叉树中的父节点,二叉树中各节点的值互不相同。此外:

  • 如果isLefti == 1,那么childi就是parenti的左子节点。
  • 如果isLefti == 0,那么childi就是parenti的右子节点。

请你根据descriptions的描述来构造二叉树并返回其根节点

测试用例会保证可以构造出有效的二叉树。

示例 1:

输入:descriptions = [[20,15,1],[20,17,0],[50,20,1],[50,80,0],[80,19,1]]输出:[50,20,80,15,17,19]解释:根节点是值为 50 的节点,因为它没有父节点。 结果二叉树如上图所示。

示例 2:

输入:descriptions = [[1,2,1],[2,3,0],[3,4,1]]输出:[1,2,null,null,3,4]解释:根节点是值为 1 的节点,因为它没有父节点。 结果二叉树如上图所示。

提示:

  • 1 <= descriptions.length <= 10^4
  • descriptions[i].length == 3
  • 1 <= parenti, childi <= 10^5
  • 0 <= isLefti <= 1
  • descriptions所描述的二叉树是一棵有效二叉树

分析:首先确定根节点,即没有父节点的节点。可以用一个哈希表记录所有出现过的子节点。遍历 description 数组,标记所有 child。再遍历一次,找到第一个 parent 不在子节点集合中的节点,它就是根节点。

接着构建节点映射关系,用一个哈希表储父节点对应的描述索引,便于快速找到父节点的所有子节点信息在 description 数组中的位置。

最后通过层次遍历构建二叉树。首先根节点进队,每次取出一个节点p,根据之前存储的父节点索引映射,找到当前节点 p 的值对应的所有 description 位置,根据 isLeft 决定挂在左孩子还是右孩子。如果子节点本身也是其他节点的父节点,则将其加入队列继续处理。
/** * 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: TreeNode* createBinaryTree(vector<vector<int>>& descriptions) { int n=descriptions.size(); map<int,int>mp; map<int,vector<int>>mp_p,mp_c; for(int i=0;i<n;++i) mp_p[descriptions[i][0]].push_back(i),mp_c[descriptions[i][1]].push_back(i),mp[descriptions[i][1]]=1; int index=0,cnt=1,f=1; for(int i=0;i<n&&f;++i) if(mp[descriptions[i][0]]==0) index=i,f=0; TreeNode* root=(TreeNode*)malloc(sizeof(TreeNode));root->left=root->right=NULL; root->val=descriptions[index][0]; queue<TreeNode*>que;que.push(root); while(!que.empty()) { TreeNode *p=que.front();que.pop(); int len=mp_p[p->val].size(); for(int i=0;i<len;++i) { TreeNode *q=(TreeNode*)malloc(sizeof(TreeNode));;q->left=q->right=NULL; q->val=descriptions[mp_p[p->val][i]][1]; if(descriptions[mp_p[p->val][i]][2]==1) p->left=q; else p->right=q; if(mp_p[q->val].size())que.push(q); } } return root; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 9:36:43

3分钟学会猫抓插件:新手也能轻松下载网页视频音频的完整指南

3分钟学会猫抓插件&#xff1a;新手也能轻松下载网页视频音频的完整指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾遇到在线视频无法…

作者头像 李华
网站建设 2026/6/25 9:33:08

从MCAL/SDK到RTD:嵌入式驱动架构迁移实战与避坑指南

1. 项目概述与核心价值在嵌入式开发领域&#xff0c;尤其是汽车电子和工业控制这类对实时性、可靠性和安全性要求极高的场景&#xff0c;软件架构的每一次演进都牵动着无数工程师的神经。最近几年&#xff0c;一个明显的趋势是从传统的、相对独立的软件开发套件&#xff08;SDK…

作者头像 李华
网站建设 2026/6/8 14:51:07

从ResNet到GAN:手把手拆解反卷积(转置卷积)在CV模型里的核心作用

从ResNet到GAN&#xff1a;手把手拆解反卷积&#xff08;转置卷积&#xff09;在CV模型里的核心作用计算机视觉领域的技术演进如同一部精密编织的史诗&#xff0c;而反卷积技术则是其中一条贯穿始终的金线。这项最初用于网络可视化的小工具&#xff0c;如今已成为生成对抗网络、…

作者头像 李华
网站建设 2026/6/8 14:50:18

基于NXP与Azure的工业电机预测性维护实战:从硬件安全到云端监测

1. 项目概述与核心价值在工业自动化领域&#xff0c;电机的稳定运行是生产线的生命线。一次意外的停机&#xff0c;不仅意味着生产中断&#xff0c;更可能带来巨大的经济损失和安全风险。传统的定期维护或“坏了再修”的模式&#xff0c;已经难以满足现代制造业对高可靠性和高效…

作者头像 李华
网站建设 2026/6/11 19:27:08

嵌入式系统低功耗优化与调试实战:从指令级微操到系统级设计

1. 项目概述&#xff1a;嵌入式开发的“续航”与“排障”艺术干了十几年嵌入式开发&#xff0c;从早期的8位单片机玩到现在的多核Cortex-M/A系列&#xff0c;我越来越觉得&#xff0c;嵌入式系统的核心魅力&#xff0c;就在于如何在“螺蛳壳里做道场”——在极其有限的资源&…

作者头像 李华