首页 > 编程语言 >代码随想录算法训练营第十三天|二叉树的理论基础、二叉树的递归遍历、二叉树的层序遍历思路

代码随想录算法训练营第十三天|二叉树的理论基础、二叉树的递归遍历、二叉树的层序遍历思路

时间:2024-11-05 19:15:49浏览次数:4  
标签:node 遍历 val self right 二叉树 第十三天 left

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,self,right,二叉树,第十三天,left
From: https://blog.csdn.net/angela3264/article/details/143481250

相关文章

  • 【初阶数据结构篇】链式结构二叉树(续)
    文章目录须知......
  • leetcode107. 二叉树的层序遍历 II
    给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)示例1:输入:root=[3,9,20,null,null,15,7]输出:[[15,7],[9,20],[3]]示例2:输入:root=[1]输出:[[1]]示例3:输入:root=[]输出:[]提示:树......
  • 在 C# 中,如果您有一个 Dictionary<TKey, TValue>,并且您知道某个值(value),想要找到对应的键
    usingSystem;usingSystem.Collections.Generic;classProgram{staticvoidMain(){//创建一个字典Dictionary<string,int>sports=newDictionary<string,int>{{"篮球",1},{&qu......
  • 数据结构 ——— 计算链式二叉树叶子节点的个数以及计算链式二叉树的高度
    目录前言链式二叉树示意图​编辑手搓一个链式二叉树计算链式二叉树的叶子节点个数计算链式二叉树的高度 前言上一章学习了计算链式二叉树的节点个数数据结构———计算链式二叉树节点的个数-CSDN博客接下来学习的是计算链式二叉树叶子节点的个数以及计算链式二叉......
  • 二叉树的一些相关操作
    前言    链式结构二叉树的访问基本使用递归来进行访问,同时也可以体现出递归的暴力美学。因为有涉及到二叉树的相关操作,因此先要手动构造一个二叉树,在对其进行一些操作。        本篇一切对二叉树的操作都基于我创建的二叉树        这个是我构造的......
  • 实习冲刺第十三天
    704.二分查找给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4代码详解: c......
  • 二叉树的递归遍历(前、中、后序)
    二叉树的递归遍历题目链接:前序遍历:LeetCode144中序遍历:LeetCode94后序遍历:LeetCode145描述给你二叉树的根节点root,返回它节点值的前序、中序、后序遍历。示例1:前序遍历输入:root=[1,null,2,3]输出:[1,2,3]示例2:中序遍历输入:root=[1,null,......
  • 数据结构 ——— 链式二叉树的前中后序遍历递归实现
    目录前言链式二叉树示意图​编辑手搓一个链式二叉树链式二叉树的前序遍历链式二叉树的中序遍历链式二叉树的后序遍历 前言在上一章学习了链式二叉树的前中后序遍历的解析数据结构———链式二叉树的前中后序遍历解析-CSDN博客接下来要学习的是代码实现链式二叉树......
  • 【数据结构】二叉树——堆
    一、二叉树的概念与结构二叉树的概念二叉树是树的一种,二叉树的特殊之处在于,每个根节点都可以有两个子节点,可以两个子节点都为空,或者一个为空,一个不为空,或者两个都有数,在构建二叉树的节点时就可以看出:现实中的二叉树:就像这颗树,每次分叉都分出两个枝条,这就是一个二叉树......