首页 > 其他分享 >代码随想录刷题学习日记

代码随想录刷题学习日记

时间:2024-11-03 12:44:22浏览次数:7  
标签:遍历 int 中序 随想录 数组 postorder inorder 日记 刷题

仅为个人记录复盘学习历程,解题思路来自代码随想录

代码随想录刷题笔记总结网址:
代码随想录

106.从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树,假设树中没有重复的元素。

提供参数:中序遍历数组inorder,后序遍历数组postorder

主要操作:

递归三要素

1.返回值类型和参数:

由于需要构造二叉树,返回值类型为节点,参数为中序遍历数组inorder,后续遍历数组postorder。

2.终止条件:

当后续遍历数组postorder没有数据时返回null

3.单层递归逻辑:

获取节点

构造节点

如果当前构造节点是叶节点直接返回

如果并不是叶节点,为下一次递归准备数据

获取分界点索引,分割中序遍历数组,构造左子中序遍历数组,右子中序遍历数组。

舍弃末尾元素,分割后续遍历数组,构造左子后续遍历数组,右子后续遍历数组。(根据索引,根据数据个数)

继续遍历左子中序遍历数组,左子后续遍历数组。

继续遍历右子中序遍历数组,右子后续遍历数组。

代码大致如下:

    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if(inorder.length==0||postorder.length==0)return null;

        List<Integer>inorderList=new ArrayList<>();
        List<Integer>postorderList=new ArrayList<>();
        for(int i=0;i<inorder.length;i++){
            inorderList.add(inorder[i]);
            postorderList.add(postorder[i]);
        }
        return traversal(inorderList,postorderList); 
        
    }
    public TreeNode traversal(List<Integer>inorder,List<Integer>postorder){
        //终止条件
        if(postorder.size()==0)return null;
        //单层递归逻辑
        //获取后续遍历最后一个元素作为中序遍历的分界点
        int deleteNum=postorder.get(postorder.size()-1);
        //构造节点
        TreeNode node=new TreeNode(deleteNum);
        //如果为叶节点,直接将该结点返回
        if(postorder.size()==1)return node;
        //不为叶节点,分割数组
        //分割中序遍历数组
        int deleteIndex=0;
        for(int i=0;i<inorder.size();i++){
            if(inorder.get(i)==deleteNum){
                deleteIndex=i;
                break;
            }
        }
        //左闭右开
        List<Integer>leftinorder=inorder.subList(0,deleteIndex);
        List<Integer>rightinorder=inorder.subList(deleteIndex+1,inorder.size());

        List<Integer>leftpostorder=postorder.subList(0,deleteIndex);
        List<Integer>rightpostorder=postorder.subList(deleteIndex,inorder.size()-1);

        node.left=traversal(leftinorder,leftpostorder);
        node.right=traversal(rightinorder,rightpostorder);
        return node;
    }

105.从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树,你可以假设树中没有重复的元素。

提供参数:先序遍历数组preorder,中序遍历数组inorder

主要操作:

与上题类似,不同之处在于后序遍历数组换成了前序遍历数组,遍历需要从前开始,构造数组时也按照前序遍历数组的来即可。

代码大致如下:

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder==null||inorder==null)return null;
        List<Integer>preorderList=new ArrayList<>();
        List<Integer>inorderList=new ArrayList<>();
        for(int i=0;i <preorder.length;i++){
            preorderList.add(preorder[i]);
            inorderList.add(inorder[i]);
        }
        return traversal(preorderList,inorderList);
    }
    public TreeNode traversal(List<Integer>preorder,List<Integer>inorder){
        if(preorder.size()==0)return null;
        int deleteNum=preorder.get(0);
        TreeNode node=new TreeNode(deleteNum);
        int deleteIndex=0;
        if(preorder.size()==1)return node;
        for(int i=0;i<inorder.size();i++){
            if(inorder.get(i)==deleteNum){
                deleteIndex=i;
                break;
            }
        }
        List<Integer>leftInorder=inorder.subList(0,deleteIndex);
        List<Integer>rightInorder=inorder.subList(deleteIndex+1,inorder.size());
        List<Integer>leftPreorder=preorder.subList(1,deleteIndex+1);
        List<Integer>rightPreorder=preorder.subList(deleteIndex+1,preorder.size());
        node.left=traversal(leftPreorder,leftInorder);
        node.right=traversal(rightPreorder,rightInorder);
        return node;
    }

标签:遍历,int,中序,随想录,数组,postorder,inorder,日记,刷题
From: https://blog.csdn.net/weixin_73939095/article/details/143461415

相关文章

  • 代码随想录一刷——49.字母异位词分组
    在C语言中确实是有哈希表这个结构体的,因而利用哈希表来解决这个问题C:/** *Returnanarrayofarraysofsize*returnSize. *Thesizesofthearraysarereturnedas*returnColumnSizesarray. *Note:Bothreturnedarrayand*columnSizesarraymustbemal......
  • 代码随想录一刷——242.有效的字母异位词
    在考虑哈希表选择哪种结构的时候(数组,set,map),在大小和范围都比较小的情况下我们优先考虑数组。在本题中,我们构建一个哈希表,来统计在s中各个字母出现的频次,而后在t中对已统计好频次的哈希表进行自减操作,最后判断哈希表中每个索引是否是0,若不是则s和t不是有效地字母异位词,反之,则......
  • 代码随想录算法训练营第十天|leetcode232.用栈实现队列、leetcode225. 用队列实现栈、
    1leetcode232.用栈实现队列题目链接:232.用栈实现队列-力扣(LeetCode)文章链接:代码随想录视频链接:栈的基本操作!|LeetCode:232.用栈实现队列哔哩哔哩bilibili自己的思路:真的第一次接触这个概念,完全没有任何思路,甚至不知道从何下手1.1基本概念栈就是相当于砌墙的砖头,先......
  • 代码随想录算法训练营第九天|leetcode151.翻转字符串里的单词、卡码网55.右旋字符串、
    1leetcode151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode)文章链接:代码随想录视频链接:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词哔哩哔哩bilibili自己的思路:直接将空格去掉,然后分割字符串为列表,在列表中进行翻转,不在字符串内部操作......
  • 打卡信奥刷题(159)用C++工具信奥P1416[普及组/提高] 攻击火星
    攻击火星题目描述一群外星人将要攻击火星。火星的地图是一个nnn个点的无向图。这伙外星人将按照如下方法入侵,先攻击度为0......
  • 数组篇-代码随想录
    数组篇跳-二分查找-704-力扣classSolution{publicintsearch(int[]nums,inttarget){if(nums==null||nums.length==0)return-1;if(target<nums[0]||target>nums[nums.length-1])return-1;intleft=0,......
  • 代码随想录一刷day6 (链表day2)(链表完结)
    24.两两交换链表中的节点分三步走;1.创建dummyhead2.三个指针 cur  t1 t23.  cur->next=t2;  t1->next=t2->next;  t2->t1->next; 最后让cur=t1;注意最后返回的是dummyhead-》next 而不是head;注意最后deletedummyhead19.删除链表的倒数第N个节点注......
  • 打卡信奥刷题(161)用C++信奥P1451[普及组/提高] 求细胞数量
    求细胞数量题目描述一矩形阵列由数字000到999组成,数字......
  • 代码随想录一刷Day6--链表day1
    1.增加虚拟头节点,使头节点的移除跟别的移除统一(否则头节点需要让head指针往后移)2.删除节点的话,注意delete203.移除链表元素对链表的操作有点不熟悉ListNode*DummyHead=newListNode(0,head);  使用new进行虚拟头节点的创建删除tmp删除分支时,不用让cur=cur-》next 70......