我正在参加「掘金·启航计划」
一、题目描述:
给你一个二维整数数组 descriptions ,其中 descriptions[i] = [parenti, childi, isLefti] 表示 parenti 是 childi 在 二叉树 中的 父节点,二叉树中各节点的值 互不相同 。此外:
如果 isLefti == 1 ,那么 childi 就是 parenti 的左子节点。 如果 isLefti == 0 ,那么 childi 就是 parenti 的右子节点。 请你根据 descriptions 的描述来构造二叉树并返回其 根节点 。
测试用例会保证可以构造出 有效 的二叉树。
示例 1:
输入:descriptions = [[20,15,1],[20,17,0],[50,20,1],[50,80,0],[80,19,1]] 输出:[50,20,80,15,17,19] 解释:根节点是值为 50 的节点,因为它没有父节点。 结果二叉树如上图所示。 示例 2:
输入: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;
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐
希望对你有帮助
期待下次再见~
🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做起