• 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
  • 相关阅读:
    Web前端vueDemo—实现记事本功能(三)
    contentEditable属性
    【从零开始学微服务】01.微服务的过去与现在
    PDF编辑阅读:Acrobat Pro DC 2021中文稳定版
    音频怎么录制?让你轻松成为录音专家!
    基于MIMO+16QAM系统的VBLAST译码算法matlab仿真
    SCM系统是什么?供应链管理系统有哪些优势?
    密码学——1.密码学概论
    1024,向着“顶尖程序员“迈进
    Kubernetes简略架构
  • 原文地址:https://blog.csdn.net/wangjun861205/article/details/126022863