• 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
  • 相关阅读:
    Vue2.0开发之——Vue基础用法-axios(29)
    说一说MVCC多版本并发控制器?
    【Java-LangChain:使用 ChatGPT API 搭建系统-3】评估输入-分类
    【cmake实战十】c++从动态库(dll)导出类
    Unity下载资源且保存
    matplotlib绘制直方图示例
    yaml 知识点记录
    IDEA构建Maven JavaSE工程的全面指南
    Java必须掌握的多态的优势和弊端(含面试大厂题和源码)
    浅析基于AI智能识别技术的明厨亮灶智能化监管方案
  • 原文地址:https://blog.csdn.net/wangjun861205/article/details/126022863