LeetCode每日一题(2196. Create Binary Tree From Descriptions)

本文介绍如何通过给定的二维描述符数组构建二叉树,重点在于理解节点间的父子关系及左、右子节点标识,最后实现根节点的查找并构建整个树结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

You are given a 2D integer array descriptions where descriptions[i] = [parenti, childi, isLefti] indicates that parenti is the parent of childi in a binary tree of unique values. Furthermore,

If isLefti == 1, then childi is the left child of parenti.
If isLefti == 0, then childi is the right child of parenti.
Construct the binary tree described by descriptions and return its root.

The test cases will be generated such that the binary tree is valid.

Example 1:

Input: descriptions = [[20,15,1],[20,17,0],[50,20,1],[50,80,0],[80,19,1]]
Output: [50,20,80,15,17,19]
Explanation: The root node is the node with value 50 since it has no parent.
The resulting binary tree is shown in the diagram.

Example 2:

Input: descriptions = [[1,2,1],[2,3,0],[3,4,1]]
Output: [1,2,null,null,3,4]

Explanation: The root node is the node with value 1 since it has no parent.
The resulting binary tree is shown in the diagram.

Constraints:

  • 1 <= descriptions.length <= 104
  • descriptions[i].length == 3
  • 1 <= parenti, childi <= 105
  • 0 <= isLefti <= 1
  • The binary tree described by descriptions is valid.

找到根节点,然后根据关系从上向下构建整棵树


use std::cell::RefCell;
use std::collections::{HashMap, HashSet};
use std::rc::Rc;
impl Solution {
    fn build(root: i32, children: &HashMap<i32, Vec<i32>>) -> Option<Rc<RefCell<TreeNode>>> {
        if root == -1 {
            return None;
        }
        let mut node = TreeNode::new(root);
        if let Some(c) = children.get(&root) {
            node.left = Solution::build(c[0], children);
            node.right = Solution::build(c[1], children);
        }
        Some(Rc::new(RefCell::new(node)))
    }
    pub fn create_binary_tree(descriptions: Vec<Vec<i32>>) -> Option<Rc<RefCell<TreeNode>>> {
        let mut children = HashMap::new();
        let mut root = HashSet::new();
        let mut removed = HashSet::new();
        for desc in descriptions {
            children.entry(desc[0]).or_insert(vec![-1, -1])[(desc[2] - 1).abs() as usize] = desc[1];
            if !removed.contains(&desc[0]) {
                root.insert(desc[0]);
            }
            root.remove(&desc[1]);
            removed.insert(desc[1]);
        }
        if root.len() != 1 {
            unreachable!()
        }

        for r in root {
            return Solution::build(r, &children);
        }
        unreachable!()
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值