首页 > 其他分享 >LeetCode刷题笔记9.9-9.15

LeetCode刷题笔记9.9-9.15

时间:2024-11-14 14:20:49浏览次数:1  
标签:traverse 遍历 cur 9.15 节点 9.9 root LeetCode 二叉树

LeetCode刷题笔记9.9-9.15

二叉树

主要学两种遍历方式:层序遍历、递归遍历

1)层序遍历BFS

基本思想:逐层遍历元素,可以借助队列,先进先出,队首出元素的同时进该元素的左右节点(这也是最简单的实现方式)

队列Q:1 -> 出1 进2,3(2,3)-> 出2 进4(3,4)-> 出3 进5,6(4,5,6)-> 出4(5,6)-> 出5(6)-> 出6(空)
队列进出元素的操作在遇到队列为空时停止

void levelOrderTraverse(TreeNode root) {
    if (root == null) {
        return;
    }
    Queue<TreeNode> q = new LinkedList<>();
    q.offer(root);
    while (!q.isEmpty()) {
        TreeNode cur = q.poll();
        // 访问 cur 节点
        System.out.println(cur.val);

        // 把 cur 的左右子节点加入队列
        if (cur.left != null) {
            q.offer(cur.left);
        }
        if (cur.right != null) {
            q.offer(cur.right);
        }
    }
}

进阶思想:在层次遍历过程中记录树的深度
记录深度的时机:

队列Q:1 -> 出1 进2,3(2,3)-> 出2 进4(3,4)-> 出3 进5,6(4,5,6)-> 出4(5,6)-> 出5(6)-> 出6(空)

当前层的所有节点的孩子节点全部列入队列时,此时一定是当前层的最后一个节点刚出队列,比如以上变换过程中的出3后,当前第2层(从1层算起)遍历结束,第3层开始遍历
修改基础的遍历代码:

void levelOrderTraverse(TreeNode root) {
    if (root == null) {
        return;
    }
    int depth = 0;
    Queue<TreeNode> q = new LinkedList<>();
    q.offer(root);
    while (!q.isEmpty()) {

        int depthSize = q.size();
        for(int i = 0; i < depthSize; i++){
            TreeNode cur = q.poll();
            // 访问 cur 节点
            System.out.println(cur.val);

            // 把 cur 的左右子节点加入队列
            if (cur.left != null) {
                q.offer(cur.left);
            }
            if (cur.right != null) {
                q.offer(cur.right);
            }
        }

        depth++;
    }
}

【二叉树的层序遍历可以用到求与二叉树最短深度/到叶子节点的最短路径相关的题目中,深度遍历必须要遍历完所有树枝的深度,作比较后才可得到】

2)递归遍历DFS

理解递归遍历与迭代循环遍历的区别和联系

// 迭代遍历数组
void traverse(int[] arr) {
    for (int i = 0; i < arr.length; i++) {

    }
}

// 递归遍历数组
void traverse(int[] arr, int i) {
    if (i == arr.length) {
        return;
    }
    // 前序遍历要做的操作
    // 这里是每层递归刚进来的位置 适用于正序遍历
    traverse(arr, i + 1);
    // 后序遍历要做的操作
    // 这里是每层递归快要结束的位置 适用于反序遍历
}

// 迭代遍历单链表
void traverse(ListNode head) {
    for (ListNode p = head; p != null; p = p.next) {

    }
}

// 递归遍历单链表
void traverse(ListNode head) {
    if (head == null) {
        return;
    }
    // 前序位置
    traverse(head.next);
    // 后序位置
}

再来看二叉树/多叉树的递归遍历

void traverse(TreeNode root){
    if(root == null) return;
    // 这里是每层递归刚刚进入的位置,是前序的操作
    traverse(root.lchild);
    // 这里是递归左子树结束的位置,是中序的操作
    traverse(root.rchild);    
    // 这里是每层递归将要结束的位置,是后序的操作
}
class Node{
    int val;
    List<Node> children;
}
void traverse(Node root) {
    if (root == null) {
        return;
    }
    // 前序位置
    for (Node child : root.children) {
        // 依次遍历所有孩子节点来递归
        traverse(child);
    }
    // 后序位置
}

由此推导出二叉树的遍历实现规律:
前中后序是遍历二叉树过程中处理每一个节点的三个特殊时间点
不仅仅是三个顺序不同的 List:
前序位置的代码在刚刚进入当前二叉树节点的时候执行;
后序位置的代码在将要离开一个二叉树节点的时候执行;
中序位置的代码在一个二叉树节点左子树都遍历完,即将开始遍历右子树的时候执行。

二叉树的所有问题,就是让你在前中后序位置注入巧妙的代码逻辑,去达到自己的目的,你只需要单独思考每一个节点应该做什么,其他的不用你管,抛给二叉树遍历框架,递归会在所有节点上做相同的操作。

标签:traverse,遍历,cur,9.15,节点,9.9,root,LeetCode,二叉树
From: https://www.cnblogs.com/Wyuf1314/p/18404610

相关文章

  • [LeetCode] 2064. Minimized Maximum of Products Distributed to Any Store
    Youaregivenanintegernindicatingtherearenspecialtyretailstores.Therearemproducttypesofvaryingamounts,whicharegivenasa0-indexedintegerarrayquantities,wherequantities[i]representsthenumberofproductsoftheithproducttype......
  • LeetCode 1103[分糖果II]
    题目链接LeetCode1103[分糖果II]详情实例提示题解思路定义容器vecRet,使每个元素值均为0,即代表每个孩子手上开始都是0个糖果定义iCount为默认的糖果数量,初始值为1逐个遍历容器,也就是开始给每个孩子分糖果获取容器当前元素值,即每个孩子当前的糖果数量iAt如果糖果......
  • LeetCode【0046】全排列
    本文目录1中文题目2求解方法:回溯法2.1方法思路2.2Python代码2.3复杂度分析3题目总结1中文题目给定一个不含重复数字的数组nums,返回其所有可能的全排列。可以按任意顺序返回答案。示例:输入:nums=[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,......
  • [LeetCode] 1385. Find the Distance Value Between Two Arrays
    Giventwointegerarraysarr1andarr2,andtheintegerd,returnthedistancevaluebetweenthetwoarrays.Thedistancevalueisdefinedasthenumberofelementsarr1[i]suchthatthereisnotanyelementarr2[j]where|arr1[i]-arr2[j]|<=d.Exampl......
  • LeetCode 3341. Find Minimum Time to Reach Last Room I
    原题链接在这里:https://leetcode.com/problems/find-minimum-time-to-reach-last-room-i/description/题目:Thereisadungeonwith nxm roomsarrangedasagrid.Youaregivena2Darray moveTime ofsize nxm,where moveTime[i][j] representsthe minimum ......
  • 代码随想录算法训练营第二十五天| leetcode491.递增子序列、leetcode46.全排列、leetc
    1leetcode491.递增子序列题目链接:491.非递减子序列-力扣(LeetCode)文章链接:代码随想录视频链接:回溯算法精讲,树层去重与树枝去重|LeetCode:491.递增子序列_哔哩哔哩_bilibili思路:用之前的方法,结果翻车了,好好看视频学新技能吧1.1视频后的思路真的没想到用set来去重,还是基......
  • 代码随想录算法训练营第二十四天| leetcode93.复原IP地址、 leetcode78.子集、leetcod
    1leetcode93.复原IP地址题目链接:93.复原IP地址-力扣(LeetCode)文章链接:代码随想录视频链接:回溯算法如何分割字符串并判断是合法IP?|LeetCode:93.复原IP地址_哔哩哔哩_bilibili思路:就是将这个字符串符合要求的进行一个收集,然后使用列表存储,最后使用join函数将这个列表进行连......
  • LeetCode 69[x的平方根]
    题目链接LeetCode69[x的平方根]详情实例提示题解思路由于所求的是整型且是正符号整型,可以采取循环遍历的方式来求取平方根用for循环将i由0开始遍历,求平方值当平方值小于指定值,此时循环继续直到以下两种情况时退出循环:当平方值为指定值时,返回i 当平方值......
  • leetcode 59. 螺旋矩阵 II java解法
    以123456789为例n=奇数结果1                2                3      i8                9                47                6             ......
  • 代码随想录算法训练营第二十三天| leetcode39. 组合总和、leetcode40.组合总和II、lee
    1leetcode39.组合总和题目链接:39.组合总和-力扣(LeetCode)文章链接:代码随想录视频链接:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)|回溯法精讲!_哔哩哔哩_bilibili思路:跟之前差不多,就是将他的循环改一下,但是我发现有重复的数值了,不知道如何删除1.1自......