首页 > 编程语言 >代码随想录算法训练营第十四天 | 226.翻转二叉树 101.对称二叉树 104.二叉树的最大深度(先掌握递归法)

代码随想录算法训练营第十四天 | 226.翻转二叉树 101.对称二叉树 104.二叉树的最大深度(先掌握递归法)

时间:2024-06-21 23:54:10浏览次数:14  
标签:right self 随想录 第十四天 二叉树 root 节点 left

226.翻转二叉树

题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

解题:

思路:遍历的过程中交换每个节点的左右孩子。
选择哪种遍历方式?
中序不行,左中右,左边子节点交换完,处理中间交换了左节点和右节点,再处理右节点去交换时这个右节点就是原来的左节点,所以有一边就一直没处理。

点击查看代码
# 前序
class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return None
        root.left,root.right=root.right,root.left
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root

101.对称二叉树
题目:给你一个二叉树的根节点 root , 检查它是否轴对称。

解题:

思路:只能用后序,因为要先比较左子树和右子树是否可以翻转的信息再返回给上一层。
如何判断能否翻转?
1.先排除左右节点包含空节点情况,一边空的肯定不行,两边空的肯定行;
2.再排除左右节点值不同的情况肯定不行;
3.然后开始比较下一层:后序,先判断外层,再判断内层,最后中间逻辑处理(是否相等)告诉父节点;
关键:递归到最底层才开始一层一层返回值。相当于是先一层层处理,然后能进入到最后层,并且判断也是True,就把这个值返回到出最初的root比较。

点击查看代码
class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        return self.compare(root.left, root.right)
        
    def compare(self, left, right):
        #首先排除空节点的情况
        if left == None and right != None: return False
        elif left != None and right == None: return False
        elif left == None and right == None: return True
        #排除了空节点,再排除数值不相同的情况
        elif left.val != right.val: return False
        
        #此时就是:左右节点都不为空,且数值相同的情况
        #此时才做递归,做下一层的判断
        outside = self.compare(left.left, right.right) #左子树:左、 右子树:右
        inside = self.compare(left.right, right.left) #左子树:右、 右子树:左
        isSame = outside and inside #左子树:中、 右子树:中 (逻辑处理)
        return isSame

104.二叉树的最大深度

题目:给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

解题:

思路:根节点的高度就是二叉树的最大深度,所以这里用的是后序。
二叉树节点的深度:离根节点的距离,和正常遍历顺序一样,从上往下计数,逐层加一。这里用前序,每到下一层先加一。
二叉树节点的高度:离叶子节点的距离,就要从下往上计数了。这种情况用后序,知道子节点高度后返回给父节点加一。
说明: 叶子节点是指没有子节点的节点。

点击查看代码
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        leftheight=self.maxDepth(root.left)
        rightheight=self.maxDepth(root.right)
        height=1+max(leftheight,rightheight)
        return height
        

心得:
二叉树题目关键考虑选择哪种遍历方式
二叉树题目都要先判断根节点为空的情况
class类里面调用def函数要前面写上self
看要不要再定义一个递归函数,看传递的参数和原函数一样不

标签:right,self,随想录,第十四天,二叉树,root,节点,left
From: https://www.cnblogs.com/MengyiSun/p/18261701

相关文章

  • Day57 代码随想录打卡|二叉树篇---修建二叉搜索树
    题目(leecodeT669):给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low,high]中。修剪树 不应该 改变保留在树中的元素的相对结构(即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在 唯一的答......
  • 代码随想录Day1-二分查找法|快慢指针
    二分查找题目链接二分查找是一个较为基础的查找方式,对一个有序没有重复值的数组进行查找时,能够提供一个较好的时间复杂度\(O(log(n))\)算法概要对于有序并且没有重复值的数组来说,我们可以首先选定整个数组的中间下标,它的值则称为中间值,通过它把大数组分成两个小的数组,其中一个......
  • 代码随想录算法训练营第17天 | 二叉树04
    代码随想录算法训练营第17天找树左下角的值https://leetcode.cn/problems/find-bottom-left-tree-value/找树左下角的值代码随想录https://leetcode.cn/problems/find-bottom-left-tree-value/路径总和https://leetcode.cn/problems/path-sum/description/路径总和2https......
  • 算法题---二叉树层序遍历
    二叉树层序遍历:classTreeNode{TreeNodeleft;TreeNoderight;intvalue;}voidlevelTraversal(TreeNoderoot){Queue<TreeNode>q=newLinkedList<>();q.add(root);while(!q.isEmpty()){......
  • 6.20-合并二叉树
    617.合并二叉树题意描述:给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为null......
  • 代码随想录刷题复习day01
    day01数组-二分查找classSolution{publicintsearch(int[]nums,inttarget){//左闭右闭intleft=0;intright=nums.length-1;intmid=0;while(right>=left){mid=left+(right-le......
  • Day56 代码随想录打卡|二叉树篇---删除二叉搜索树中的节点
    题目(leecodeT450):给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。方法:二叉搜索......
  • 【数据结构与算法】二叉树的性质 详解
    在二叉树的第i层上至多有多少个结点。在二叉树的第i层上至多有2i−1......
  • 【数据结构与算法】树,二叉树 详解
    给出树的不同的几种表示形式。邻接矩阵:这是一种二维数组,其中的元素表示两个节点之间是否存在边。这种表示形式适用于稠密图,但对于稀疏图可能会浪费很多空间。邻接表:这是一种数组和链表的组合结构。数组的每个元素都是一个链表,链表中的元素表示与该节点相连的其他节点。这种......
  • Leedcode【222】. 完全二叉树的节点个数——Java解法(递归)
    Problem: 222.完全二叉树的节点个数题目思路解题方法复杂度Code效果题目给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的......