首页 > 编程语言 >代码随想录算法训练营第十三天

代码随想录算法训练营第十三天

时间:2024-10-30 12:58:34浏览次数:7  
标签:node 遍历 val 训练营 随想录 right left self 第十三天

1 二叉树的理论基础

文章链接:代码随想录

视频链接:关于二叉树,你该了解这些!| 二叉树理论基础一网打尽,二叉树的种类、二叉树的存储方式、二叉树节点定义、二叉树的遍历顺序_哔哩哔哩_bilibili

1.1 二叉树的种类

  1. 满二叉树

所有节点处的值都排满了,没有空的

  1. 完全二叉树

只有在最后一层的时候,从左至右是顺序存储,且空的位置只能在右边,左边不能有空的

  1. 二叉搜索树

这种就是满足左边数值中满足所有数值都小于根节点数,右边的数值满足所有数值都大于根节点数

  1. 平衡二叉搜索树

满足二叉搜索树的基本要求后,其左右节点的高度差不超过1

1.2 二叉树的存储方式

链式存储和顺序存储

  1. 链式存储

这种方式就是相当于之前学的链表一样,每一个值拥有左指针和右指针,最后一层的左右指针指向空位置即可

  1. 顺序存储

就相当于数组的存储,先存储父节点,然后在存储子节点,一步一步下来

1.3 二叉树的遍历方式

深度遍历和广度遍历

  1. 深度遍历

这种是先向下遍历;这个分为三种:前序遍历,中序遍历和后续遍历;前序遍历是中左右,中序遍历是左中右,后续遍历是左右中;这个前后的顺序其实是指中节点在哪个位置

  1. 广度遍历

这种方式就是横着遍历的,就可以使用了

1.4 二叉树的定义方式

这个定义就是需要定义一个值,和左右节点,即指针即可

class TreeNode:
    def __init__(self,val,left=None,right=None):
        self.val = val
        self.left = left
        self.right = right

2 二叉树的递归遍历

文章链接:代码随想录

视频链接:每次写递归都要靠直觉? 这次带你学透二叉树的递归遍历!| LeetCode:144.前序遍历,145.后序遍历,94.中序遍历_哔哩哔哩_bilibili

自己的思路:害,这种题真的就是,一看就会,一做就废

2.1 递归算法的三部曲

  1. 确定递归函数的参数和返回值
  2. 确定终止条件
  3. 确定单层递归的逻辑

2.2 递归的三道题

每次添加的值都是中序的值,其他的就向下遍历

思考:为什么不是左的值和右的值?

因为左和右的值她的下面还有下一层值,无限循环,,,

2.2.1 前序遍历

题目链接:144. 二叉树的前序遍历 - 力扣(LeetCode)

前序的顺序是中左右,所以先添加中序的值,遇到左右继续遍历

# 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 preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        result = []
        def res(node):
            if node == None:
                return
            result.append(node.val)
            res(node.left)
            res(node.right)
        res(root)
        return result
2.2.2 中序遍历

题目链接:94. 二叉树的中序遍历 - 力扣(LeetCode)

中序遍历是左中右的顺序,按照这个往下写就行

# 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 inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        result = []
        def dfs(node):
            if node == None:
                return
            dfs(node.left)
            result.append(node.val)
            dfs(node.right)
        dfs(root)
        return result
2.2.3 后序遍历

题目链接:145. 二叉树的后序遍历 - 力扣(LeetCode)

后序遍历过程中,其内部的结构为左右中

# 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 postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        result = []
        def dfs(node):
            if node == None:
                return
            dfs(node.left)
            dfs(node.right)
            result.append(node.val)
        dfs(root)
        return result

2.3 本题小结

  1. 从这道题来理解的话,会发现递归不难,但是自己去写逻辑还是有转不过来的时候
  2. 主要就是函数调用的时候会很吃力,不知道为什么

3 二叉树的层序遍历思路

文章链接:代码随想录

视频链接:讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode:102.二叉树的层序遍历_哔哩哔哩_bilibili

3.1 层序遍历的解题思路

  1. 首先判断整个结尾有没有空,空的话就返回一个空列表
  2. 对其进行层序遍历,首先是将其值全部存储到队列中,然后一个个弹出,增加现在的位置的值,最终进行值返回

3.2 leetcode102.二叉树的层序遍历

题目链接:102. 二叉树的层序遍历 - 力扣(LeetCode)

3.2.1 队列的方法
import collections
# 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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if root == None:
            return []
        queue = collections.deque([root])
        result =[]
        while queue:
            level =[]
            for _ in range(len(queue)):
                cur = queue.popleft()
                level.append(cur.val)
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)
            result.append(level)
        return result
3.2.2 递归的方法
import collections
# 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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if root == None:
            return []
        result =[]
        
        def dfs(node,level):
            if node ==None:
                return
            if len(result)==level:
                result.append([])
            result[level].append(node.val)
            dfs(node.left,level+1)
            dfs(node.right,level+1)
        dfs(root,0)
        return result

3.3 leetcode 107二叉树的层序遍历 II

题目链接:107. 二叉树的层序遍历 II - 力扣(LeetCode)

3.2.1 队列的方法

其实将上一道题进行一个倒序就好了

import collections
# 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 levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:
        if root == None:
            return []
        queue = collections.deque([root])
        result = []
        while queue:
            level = []
            for _ in range(len(queue)):
                cur = queue.popleft()
                level.append(cur.val)
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)
            result.append(level)
        return result[::-1]
3.2.2 递归的方法
import collections
# 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 levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:
        if root == None:
            return []
        
        result = []
        def dfs(node,level):
            if node == None:
                return
            if len(result) == level:
                result.append([])
            result[level].append(node.val)
            dfs(node.left,level+1)
            dfs(node.right,level+1)
        dfs(root,0)
        return result[::-1]

4 今日小结

  1. 怎么说呢,感觉今天的题,学起来很容易,就是一学就会,但是一做就废
  2. 内容上理解挺容易的,但是感觉因为队列掌握不是很好,其实做就没这么容易了

标签:node,遍历,val,训练营,随想录,right,left,self,第十三天
From: https://www.cnblogs.com/csfy0524/p/18515646

相关文章

  • 代码随想录算法训练营第六天| leetcode242.有效的字母异位词、leetcode349.两个数组的
    1.leetcode242.有效的字母异位词题目链接:242.有效的字母异位词-力扣(LeetCode)文章链接:代码随想录视频链接:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词哔哩哔哩bilibili自己的思路:首先就是对字符串进行分开成一个一个单独的字母,然后使用列表存储这些数据,再对......
  • 代码随想录——栈与队列8-前K个高频元素
    法一、用数组排序思路用map保存元素和频率关系将元素和频率的键值对pair作为vector的基本元素,以频率为准进行从大到小的排序——O(nlogn)输出前K个pair的first,即数字本身代码classSolution{public:std::vector<int>topKFrequent(std::vector<int......
  • 代码随想录算法训练营day30| 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.
    学习资料:https://programmercarl.com/0452.用最少数量的箭引爆气球.html重叠区域问题最远位置问题452.用最少数量的箭引爆气球(重叠区域;按左边界排序;i区间的左边界与i-1区间的右边界比较来确定是否重叠;更新i的右边界,取i与i-1区域右边界的最小值)点击查看代码classSolution(ob......
  • 代码随想录一刷-day3
    T209长度最小子数组核心:滑动窗口思想,如何用一个for循环达到两个循环的效果for(intj=0;j<num.size();j++){sum+=nums[j];//外层for循环内负责将窗口结束的坐标++;while(sum>=target){window_length=j-i+1;result=min(result,window_length);sum-=nums[i++];......
  • 代码随想录day14 二叉树(2)
    文章目录day11栈与队列(2)栈与队列的总结day13二叉树(1)day14二叉树(2)day11栈与队列(2)逆波兰表达式求值https://leetcode.cn/problems/evaluate-reverse-polish-notation/逆波兰表达式,也就是后缀表达式,所谓后缀就是指运算符写在后面。平常使用的算式则是一种......
  • 代码随想录-栈与队列6、7
    逆波兰表达式思路用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中这里记录string类型相关操作:判断token是否是数字,不可像char类型用string重载的>=,<=,前者由于用ASCII码表示,后者按字典序比较,例如1<2所以字符串比较"10"<"2"。所以直接......
  • 代码随想录:路径总和系列
    112.路径总和使用前序遍历/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=val;}*TreeNode(intval,TreeNode......
  • 代码随想录 -- 动态规划 -- 不同路径
    62.不同路径-力扣(LeetCode)思路:dp[i][j]含义:到达第(i,j)个格子有多少种走法递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1]初始化:dp[0][j]=1:到达第一行的格子都只有一种走法;dp[i][0]=1:到达第一列的格子也都只有一种走法遍历顺序:从上到下,从左到右classSolution(object):def......
  • 代码随想录算法训练营第十一天|leetcode150. 逆波兰表达式求值、leetcode239. 滑动窗
    1leetcode150.逆波兰表达式求值题目链接:150.逆波兰表达式求值-力扣(LeetCode)文章链接:代码随想录视频链接:栈的最后表演!|LeetCode:150.逆波兰表达式求值_哔哩哔哩_bilibili自己的思路:这是一道有思路,但是思路并不多的题目,就是我会觉得是先将数据进行添加,然后对于符号通过倒......
  • 代码随想录算法训练营day27| 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃
    学习资料:https://programmercarl.com/0122.买卖股票的最佳时机II.html#算法公开课贪心PART2学习记录:122.买卖股票的最佳时间2(求最大利润,贪心:把所有正数相加;后一天与当天的股票价格差值,若为正就加入利润,若为负,则不加)点击查看代码classSolution:defmaxProfit(self,pr......