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

代码随想录刷题学习日记

时间:2024-10-25 12:46:18浏览次数:3  
标签:node 遍历 随想录 日记 push 节点 null stack 刷题

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

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

二叉树的统一迭代法

二叉树的统一迭代指的是二叉树的前序遍历,中序遍历,后序遍历使用迭代法实现时,在方法和形式上较为统一的迭代方法。二叉树的前序遍历,中序遍历,后序遍历之所以无法统一是因为无法同时解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况。那么可以将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记,这样就能够实现统一迭代。

统一迭代法的中序遍历代码示例:

    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer>res=new ArrayList<>();
        Stack<TreeNode>stack=new Stack<>();
        if(root!=null) stack.push(root);
        while(!stack.isEmpty()){
            //记录栈顶元素
            TreeNode node=stack.peek();
            //不为空
            if(node!=null){
                //弹出栈顶元素
                stack.pop();
                
                //右,中,左加入
                if(node.right!=null)
                    stack.push(node.right);
                stack.push(node);
                stack.push(null);
                if(node.left!=null)
                    stack.push(node.left);

            }

            //为空
            else{
                //弹出空节点,将值加入结果集
                stack.pop();
                res.add(stack.peek().val);
                stack.pop();
            }

        }
        return res;
    }

统一迭代法的前序遍历代码只需要将统一迭代法的中序遍历代码节点加入顺序改变即可:

                //右,左,中加入
                if(node.right!=null)
                    stack.push(node.right);
                if(node.left!=null)
                    stack.push(node.left);
                stack.push(node);
                stack.push(null);

统一迭代法的后序遍历代码同样只需要将统一迭代法的中序遍历代码节点加入顺序改变即可:

                //中,右,左加入
                stack.push(node);
                stack.push(null);
                if(node.right!=null)
                    stack.push(node.right);
                if(node.left!=null)
                    stack.push(node.left);

二叉树的层序遍历(广度优先)

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

层序遍历时,先将根节点加入队列,然后每次队列弹出节点就将它的非空左右节点加入队列中,直到队列为空为止。

102.二叉树的层序遍历

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 

提供参数:根结点root

主要操作:

定义接收结果的二维数组res(每层结果使用一维数组接收)

定义队列容器queue

将根节点root放入queue

当queue不为空时,循环操作:

定义用来接收每层数据的一维数组temp

定义当前层的长度len(该层有多少个节点长度就为多少)

遍历每个节点进行以下操作:

将该结点数据存入temp

如果该结点左子节点不为空,将左子节点加入queue;

如果该结点右子节点不为空,将右子节点加入queue。

在每次遍历完一层的数据后,将temp加入res。

循环结束(队列为空)后,返回结果res。

代码示例如下:

public List<List<Integer>>res=new ArrayList<List<Integer>>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        if(root==null)return res;
        layerorder(root);
        return res;
    }
    public void layerorder(TreeNode root){

        //初始化,需要的队列,将root加入队列

        Queue<TreeNode>queue=new LinkedList<TreeNode>();
        queue.offer(root);
        //当队列不为空,持续进行
        while(!queue.isEmpty()){
            //初始化需要的容器
            List<Integer>temp=new ArrayList<>();
            //初始化长度,代表每层有多少个数据
            int len=queue.size();

            for(int i=0;i<len;i++){

                TreeNode node=queue.poll();
                temp.add(node.val);
                if(node.left!=null)queue.offer(node.left);
                if(node.right!=null)queue.offer(node.right);
            }
            res.add(temp);
        }

    }

标签:node,遍历,随想录,日记,push,节点,null,stack,刷题
From: https://blog.csdn.net/weixin_73939095/article/details/143208848

相关文章

  • 刷题总结——链表
    总论链表提供快速的前后访问和插入,不提供随机访问,要是需要随机访问需要结合hash实现链表反转类问题的关键是3个节点prevcurrnext之间的关系:由于反转的时候next会被改变,因此需要临时存储设置next的tmp=cur->next;之后可以反转,再更新prev和curr即可dummynode的引入,是......
  • 代码随想录算法训练营第24天(补第13天)|226.翻转二叉树, 101. 对称二叉树,104.二叉树的最
    226.翻转二叉树文章链接:https://programmercarl.com/0226.翻转二叉树.html#算法公开课题目链接:https://leetcode.cn/problems/invert-binary-tree/description/迭代法:这里使用了前序遍历来交换左右孩子节点classSolution{public:TreeNode*invertTree(TreeNode*r......
  • 代码随想录算法训练营day25| 491.递增子序列 46.全排列 47.全排列2
    学习资料:https://programmercarl.com/0491.递增子序列.html#算法公开课排列与组合的区别,不用startIndex,而每个树层都从0开始,但是要跳过已经用过的数(用used判断)学习记录:491.递增子序列(添加一个数组used(hash表),来保持数组每个位置上的数的使用情况,没用过为0,用过变成1)点击查看代......
  • 代码随想录算法训练营第24天(补第12天)| 递归遍历,迭代遍历,统一迭代
    前置知识二叉树的定义:structBNode{intval;BNode*lchild;BNode*rchild;BNode():lchild(NULL),rchild(NULL){}BNode(intval){val=val;lchild=rchild=NULL;}};递归遍历文章链接:https://programmercarl.com/二叉树的递归遍历.html#思路题目......
  • 刷题总结——树
    总结刷题中遇到的与树有关问题遍历问题前中后序遍历有递归与送代两种写法迭代时需要栈模拟,中序遍历单独注意写法(类似于模拟调用栈),后序遍历可以通过前序遍历+反转的方式实现题目LC编号注意事项前序递归144正常递归前序非递归144插入单个root后进行Stack......
  • 代码随想录算法训练营第九天|leetcode151.翻转字符串里的单词、卡码网55.右旋字符串
    1leetcode151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode)文章链接:代码随想录视频链接:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili自己的思路:直接将空格去掉,然后分割字符串为列表,在列表中进行翻转,不在字符串内部操作,......
  • leetcode刷题-1581. 进店却未进行过交易的顾客
    链接:1581.进店却未进行过交易的顾客-力扣(LeetCode)前提条件:表:Visits+-------------+---------+|ColumnName|Type|+-------------+---------+|visit_id|int||customer_id|int|+-------------+---------+visit_id是该表中具有唯一值的列。......
  • 代码随想录算法训练营第二十四天|Day24 回溯算法
    93.复原IP地址题目链接/文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html视频讲解:https://www.bilibili.com/video/BV1XP4y1U73i/思路char**result;intresultTop;intsegments[3];intisValid(char*s,intstart,intend){......
  • Leetcode刷题Python之3185.构成整天的下标对数目II
    提示:直接暴力求解会超过执行时间,因此要考虑其他方法降低复杂度。文章目录问题描述一、示例:二、解题思路1.找余数2.利用哈希表存储余数3.逐步统计配对数代码实现解释代码复杂度分析问题描述给定一个整数数组hours,表示时间,以小时为单位。我们需要找到数组中满......
  • 代码随想录算法训练营 | 岛屿数量 深搜,岛屿数量 广搜,岛屿的最大面积
    岛屿数量深搜题目链接:岛屿数量深搜文档讲解︰代码随想录(programmercarl.com)日期:2024-10-23想法:Java代码如下:importjava.util.Scanner;publicclassMain{publicstaticint[][]dir={{0,1},{1,0},{-1,0},{0,-1}};publicstaticvoiddfs(boolean[][]v......