首页 > 其他分享 >二叉树解题的

二叉树解题的

时间:2023-07-06 22:11:32浏览次数:51  
标签:遍历 后序 前序 nums 解题 二叉树 节点

  • 先在开头总结一下,思维模式分两类:https://labuladong.github.io/algo/2/19/33/
    • 1、是否可以通过遍历一遍二叉树得到答案?如果可以,用一个 traverse 函数配合外部变量来实现,这叫「遍历」的思维模式。
    • 2、是否可以定义一个递归函数,通过子问题(子树)的答案推导出原问题的答案?如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值,这叫「分解问题」的思维模式。
  • 如果单独抽出一个二叉树节点,它需要做什么事情?需要在什么时候(前/中/后序位置)做?其他的节点不用你操心,递归函数会帮你在所有节点上执行相同的操作。
  • 如果你告诉我,快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历,那么我就知道你是个算法高手了
    • 快速排序的逻辑是,若要对 nums[lo..hi] 进行排序,我们先找一个分界点 p,通过交换元素使得 nums[lo..p-1] 都小于等于 nums[p],且 nums[p+1..hi] 都大于 nums[p],然后递归地去 nums[lo..p-1] 和 nums[p+1..hi] 中寻找新的分界点,最后整个数组就被排序了。
    • 先构造分界点,然后去左右子数组构造分界点,你看这不就是一个二叉树的前序遍历吗?
    • 再说说归并排序的逻辑,若要对 nums[lo..hi] 进行排序,我们先对 nums[lo..mid] 排序,再对 nums[mid+1..hi] 排序,最后把这两个有序的子数组合并,整个数组就排好序了。
    • 先对左右子数组排序,然后合并(类似合并有序链表的逻辑),你看这是不是二叉树的后序遍历框架?另外,这不就是传说中的分治算法嘛,不过如此呀。
    •  
  • 深入理解前中后序
    • 我先甩给你几个问题,请默默思考 30 秒:
      • 1、你理解的二叉树的前中后序遍历是什么,仅仅是三个顺序不同的 List 吗?
      • 2、请分析,后序遍历有什么特殊之处?
      • 3、请分析,为什么多叉树没有中序遍历?
    • 先不管所谓前中后序,单看 traverse 函数,你说它在做什么事情?
      • 数组
      • 链表
      • 倒序打印链表:
      • 前序位置的代码在刚刚进入一个二叉树节点的时候执行;
      • 后序位置的代码在将要离开一个二叉树节点的时候执行;
      • 中序位置的代码在一个二叉树节点左子树都遍历完,即将开始遍历右子树的时候执行。
      • 你可以发现每个节点都有「唯一」属于自己的前中后序位置,所以我说前中后序遍历是遍历二叉树过程中处理每一个节点的三个特殊时间点。
      • 这里你也可以理解为什么多叉树没有中序位置,因为二叉树的每个节点只会进行唯一一次左子树切换右子树,而多叉树节点可能有很多子节点,会多次切换子树去遍历,所以多叉树节点没有「唯一」的中序遍历位置。
  •  
  • 二叉树题目的递归解法可以分两类思路,第一类是遍历一遍二叉树得出答案,第二类是通过分解问题计算出答案,这两类思路分别对应着 回溯算法核心框架 和 动态规划核心框架
    • 二叉树最大深度:
      • 遍历:
      • 分解问题:
    • 前序遍历:
      • 遍历:
      • 分解:一棵二叉树的前序遍历结果 = 根节点 + 左子树的前序遍历结果 + 右子树的前序遍历结果
  • 综上,遇到一道二叉树的题目时的通用思考过程是:
    • 1、是否可以通过遍历一遍二叉树得到答案?如果可以,用一个 traverse 函数配合外部变量来实现。
    • 2、是否可以定义一个递归函数,通过子问题(子树)的答案推导出原问题的答案?如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值。
    • 3、无论使用哪一种思维模式,你都要明白二叉树的每一个节点需要做什么,需要在什么时候(前中后序)做。
  • 后序位置的特殊之处
    • 中序位置主要用在 BST 场景中,你完全可以把 BST 的中序遍历认为是遍历有序数组。
    • 前序位置本身其实没有什么特别的性质,之所以你发现好像很多题都是在前序位置写代码,实际上是因为我们习惯把那些对前中后序位置不敏感的代码写在前序位置罢了。
    • 你可以发现,前序位置的代码执行是自顶向下的,而后序位置的代码执行是自底向上的:意味着前序位置的代码只能从函数参数中获取父节点传递来的数据,而后序位置的代码不仅可以获取参数数据,还可以获取到子树通过函数返回值传递回来的数据。
    • 遇到子树问题,首先想到的是给函数设置返回值,然后在后序位置做文章。那么换句话说,一旦你发现题目和子树有关,那大概率要给函数设置合理的定义和返回值,在后序位置写代码了。
    • 1、如果把根节点看做第 1 层,如何打印出每一个节点所在的层数?
      • 个节点在第几层,你从根节点遍历过来的过程就能顺带记录
    • 2、如何打印出每个节点的左右子树各有多少节点?
      • 而以一个节点为根的整棵子树有多少个节点,你需要遍历完子树之后才能数清楚。
  •  
  •  
  •  

标签:遍历,后序,前序,nums,解题,二叉树,节点
From: https://www.cnblogs.com/zle1992/p/17533468.html

相关文章

  • 面试题 16.07. 最大数值 ——一种基于乘法和位运算的解题思路
    剧透警告,没写过的勿触题目:编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。qwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqq......
  • 题:二叉树中m是n的祖先,通过(后序遍历)可以找到m到n的路径
     选项:先序?中序?后序?层次? 题解:1.首先是对路径的解释:访问一个结点x时,栈中结点恰好是x结点的所有祖先,从栈底到栈顶所有结点加上x结点,就构成了从根结点到x结点的一条路径。2.分析:为什么不是先序遍历?(第一次做题时以为这个路径指的是遍历的结果,那先序自然就满足,但这个路径不是遍历......
  • 24届秋招专场 · 数组如何用双指针解题呢?
    你好,我是安然无虞。文章目录删除有序数组中的重复项删除排序链表中的重复元素移除元素移除零大家好,近期主要更新数组相关的解题算法咯,感兴趣的老铁可以一起看过来啦。今天更新使用双指针解决数组部分题型,注意哦,这里所说的双指针不是C语言中“指针”的概念,指的是数组的索引下标,......
  • LeetCode 236. 二叉树的最近公共祖先
    题目链接:LeetCode236.二叉树的最近公共祖先题意:给定一个二叉树,找到该树中两个指定节点的最近公共祖先。解题思路:利用二叉树的后序遍历回溯(从下往上遍历)的思想,依次遍历整个二叉树,在遍历过程中,遇到P就返回p的父节点,遇到q就返回q的父节点,(也就是找到了p,q各自的祖先)......
  • 1043_二叉树的生成和遍历(循环方式)
    1、遍历方法前序遍历(preOrder)对每个节点(子树)、贯彻这个遍历顺序:根->左->右中序遍历(inOrder)左->根->右后序遍历(postOrder)左->右->根层序遍历一层一层、从左到右遍历参考资料:二叉树各种遍历方法递归和循环实现树的层次遍历的几种方法......
  • 「解题报告」2023.7.1 洛谷7月月赛
    『XYGOIround1』三个数题目描述MX有一个有\((w-2)\)个数的集合\(S=\{3,4,5,\cdots,w\}\)。要求构造一个只包含非负整数的集合(无重复元素),使得\(S\)里面的任何一个数都能被这个集合里面大于等于\(3\)个不同的数相加得到,求这个集合中至少包含多少个元素。输入格式本题......
  • 二叉树中的递归算法(二)
    从二叉树遍历看递归二叉树二叉树(binarytree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。二叉树的遍......
  • JZ82 二叉树中和为某一值的路径(一)
    二叉树递归/***structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*TreeNode(intx):val(x),left(nullptr),right(nullptr){}*};*/classSolution{public:/***代码中的类名、方法名、参数名已经......
  • JZ55 二叉树的深度
    暴搜:两种个思路:DFS和BFSDFS:里面有个容易误会的地方:每次迭代+1,不是针对子叶来说的,而是针对当前点来说的,由于遍历是自底向上的,因此当前遍历到的点对于已经遍历到的点来说就是根,因此深度+1.classSolution{public:intTreeDepth(TreeNode*pRoot){if(pRoot==n......
  • 二叉树-前序遍历-leetcode222
    给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~2h个节点。示例1:输入:root=[1,2,3......