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


    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!()
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    server win搭建apache网站服务器+php网站+MY SQL数据库调用电子阅览室
    有趣的java面试题-集合篇 (二) Map
    掌握PoE交换机的潜力:全面的以太网供电连接手册
    国密浏览器是什么?有哪些?有什么特点?
    美团技术官用时一个月精心整理这本Spring(第4版)实战学习文档
    STM32驱动美上美(SIQ-02FVC3)拨盘编码器硬件
    【C语言】语法--联合体union详解
    windows glog 安装以及环境搭建
    HashMap底层数据是如何存储的呢?
    qt mingw 生成DUMP文件,和pdb文件
  • 原文地址:https://blog.csdn.net/wangjun861205/article/details/126022863