day13-数据结构力扣

也是优先掌握递归的方法

110.平衡二叉树

题目链接 110. 平衡二叉树 - 力扣(LeetCode)

思路

首先了解什么是平衡二叉树

平衡二叉树(Balanced Binary Tree)是一种特殊的二叉搜索树(BST),其左右子树的高度差不超过1 。这种结构确保了树的查询、插入和删除操作的时间复杂度维持在 O(log n) ,避免普通二叉搜索树退化为链表(时间复杂度恶化至 O(n))。

主要用他左右子树的高度差来解题

确定遍历顺序:后序遍历

递归法

1.确定传入的东西:根节点

2.确定停止递归的条件:递归的过程中遇到空节点了为终止,返回0

3.单个递归的处理逻辑:

得到左右子树的高度,计算左右子树的差值,大于1,返回-1

如果差值没有大于1,返回树的高度

提交

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        return self.gethight(root)>0

    def gethight(self,node):
        if not node:
            return 0
        lefthight=self.gethight(node.left)
        if lefthight==-1:
            return -1
        righthight=self.gethight(node.right)
        if righthight==-1:
            return -1
        if (abs(lefthight-righthight)>1):
            res=-1
        else:
            res=1+max(lefthight,righthight)
        return res

257. 二叉树的所有路径

题目链接 257. 二叉树的所有路径 - 力扣(LeetCode)

思路

没有思路,好像还有用到回溯,更不会了

箭头上面的序号就是我们走的顺序,其实还是能看懂就是不知道代码怎么写

核心思路

从根走到每一个叶子 ,把路径记下来。必须用 前序遍历(根 → 左 → 右),因为要先把当前节点放进路径,再走孩子。

递归思路

  • 先把当前节点加入路径

  • 如果是叶子节点(左右都空),就把这条路径存进结果

  • 如果有左孩子,递归走左

  • 如果有右孩子,递归走右

  • 返回上一层前,把当前节点从路径删掉(这就是回溯)

总结

  • 遍历:前序

  • 终止:到叶子就存路径

  • 关键:递归走左右,回溯退一步

  • 本质:根到所有叶子的遍历 + 路径回退

提交

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        res=[]
        path=[]
        if not root:
            return res
        self.traversal(root,path,res)
        return res

    def traversal(self,cur,path,res):
        path.append(cur.val)
        if not cur.left and not cur.right://叶子结点收集结果
            spath='->'.join(map(str,path))
            res.append(spath)
            return
        if cur.left:
            self.traversal(cur.left,path,res)
            path.pop()//回溯
        if cur.right:
            self.traversal(cur.right,path,res)
            path.pop()//回溯

404.左叶子之和

题目链接404. 左叶子之和 - 力扣(LeetCode)

思路

这个思路并不算很复杂,我说一下自己刚开始写错的地方

1.只判断了node.left就加上他的值,应该还需要判断他是叶子结点,也就是,node.left没有左节点和右结点

2.没写完递归逻辑

python 复制代码
        sum1+=self.count(node.left)
        sum1+=self.count(node.right)

提交

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        return self.count(root)

    def count(self,node):
        sum1=0
        if not node:
            return sum1
        if node.left and not node.left.left and not node.left.right:
            sum1+=node.left.val
        sum1+=self.count(node.left)
        sum1+=self.count(node.right)
        return sum1
        

222.完全二叉树的节点个数

题目链接 222. 完全二叉树的节点个数 - 力扣(LeetCode)

思路

能不能就直接遍历,然后把结果存到数组里面,然后我求数组的大小。

可以

提交

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        return len(self.traversal(root))

    def traversal(self,node):
        if not node:
            return []
        return [node]+self.traversal(node.left)+self.traversal(node.right)

这里需要注意的就是,traversal确定返回数组,那就要统一。我刚开始把return那里写成返回0。

相关推荐
数据皮皮侠几秒前
全国消协智慧 315 平台投诉信息数据库
大数据·人工智能·算法·百度·制造
8Qi89 分钟前
LeetCode 115 & 392:不同子序列 / 判断子序列
算法·leetcode·职场和发展·动态规划
小蒋学算法28 分钟前
算法-乘法表中第K小的数-二分
数据结构·算法
智者知已应修善业37 分钟前
【51单片机8个LED,已经使用了D1D2,怎么样在不动D1D2的前提下实现D6~D8的流水灯】2024-1-19
c++·经验分享·笔记·算法·51单片机
Evand J38 分钟前
【MATLAB例程】自适应渐消扩展卡尔曼滤波(AFEKF)三维雷达目标跟踪|效果已调优,附下载链接和运行结果,代码直接运行即可
开发语言·算法·matlab·目标跟踪·卡尔曼滤波·自适应滤波·代码定制
圣保罗的大教堂1 小时前
leetcode 2161. 根据给定数字划分数组 中等
leetcode
插件开发1 小时前
矢量路径运算如何选GPU技术?——适用算法对比及OpenGL/Direct3D/CUDA选型指南
算法·3d
8Qi81 小时前
LeetCode 72:编辑距离(Edit Distance)—— 题解
算法·leetcode·职场和发展·动态规划
SoftLipaRZC2 小时前
顺序表的应用:通讯录项目与经典算法实战
算法
8Qi82 小时前
LeetCode 583. 两个字符串的删除操作
算法·leetcode·职场和发展·动态规划