启航计划·根据描述创建二叉树

268 阅读1分钟

我正在参加「掘金·启航计划」

一、题目描述:

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

如果 isLefti == 1 ,那么 childi 就是 parenti 的左子节点。 如果 isLefti == 0 ,那么 childi 就是 parenti 的右子节点。 请你根据 descriptions 的描述来构造二叉树并返回其 根节点 。

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

 

示例 1:

image.png

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

image.png

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

提示:

1 <= descriptions.length <= 104 descriptions[i].length == 3 1 <= parenti, childi <= 105 0 <= isLefti <= 1 descriptions 所描述的二叉树是一棵有效二叉树

来源:力扣(LeetCode) 链接:leetcode.cn/problems/cr… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

使用哈希表和Set,哈希表存放各个value对应的树节点,Set存放有父节点的节点,最后没有父节点的节点(不在set中)就是根节点,返回即可

过程:遍历descriptions数组,取cur为当前遍历的数组,

如果cur[0]、cur[1]为值的数组未曾添加进map中,则将其添加,然后丰富以cur[0]为value的树节点,添加其子节点(cur[1])

最后将cur[1]的值添加进set,因为该节点不可能为根节点,其有父节点。

三、AC 代码:

class Solution {
    public TreeNode createBinaryTree(int[][] descriptions) {
        Map<Integer,TreeNode> map=new HashMap<>();
        Set<Integer> flag=new HashSet<>();
        for(int []cur:descriptions){
            if(!map.containsKey(cur[0])){
                map.put(cur[0],new TreeNode(cur[0]));
            }
            if(!map.containsKey(cur[1])){
                map.put(cur[1],new TreeNode(cur[1]));
            }
            if(cur[2]==1){
                map.get(cur[0]).left=map.get(cur[1]);
            }
            else{
                map.get(cur[0]).right=map.get(cur[1]);
            }
            flag.add(cur[1]);
        }
        for(int []cur:descriptions){
            if(!flag.contains(cur[0])){
                return map.get(cur[0]);
            }
        }
        return null;
    }
}

四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助

期待下次再见~

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做起