首页 > 其他分享 >代码训练营 Day13 | 递归遍历 | 层序遍历

代码训练营 Day13 | 递归遍历 | 层序遍历

时间:2024-08-26 11:52:09浏览次数:8  
标签:node 遍历 val self 层序 right Day13 root left

144. 二叉树的前序遍历

  1. 递归思路:
    1. 确定递归函数的参数和返回值

    2. 确定递归函数的终止条件

    3. 确定单层递归的逻辑

  2. 前序遍历顺序: 中左右

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        res = []
        
        def traversal(node):
            # when current pointer reach None, it menas end
            if node == None:
                return 
        

            # iterate order: middle;left;right
            res.append(node.val) # middle
            traversal(node.left) # left
            traversal(node.right) # right
        
        traversal(root)

        return res

145. 二叉树后序遍历

  1. 后续遍历的顺序: 左右中
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        # create an array store value
        res = []

        def dfs(node):
            # if node met none, return
            if node == None:
                return 

            
            # postorder traversal order: left right middle
            dfs(node.left)  # left
            dfs(node.right) # right
            res.append(node.val) # middle
        
        dfs(root)

        return res

94. 二叉树中序遍历

  1. 中序遍历的顺序: 左中右
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        # create an array
        res = []

        def dfs(node):
            # if reach to the end, return None
            if node == None:
                return
            
            # Inorder Traversal order: left middle right
            dfs(node.left)          # left
            res.append(node.val)    # middle
            dfs(node.right)         # right
        
        dfs(root)
        return res

层序遍历

  1. 我们通过记录队列的size来得知每一层应该弹出以及应该保存的元素有几个

  2. 如果root为空;则返回空数组

  3. 遍历队列,直到队列为空为止

  4. 创建一个数组用来存储每一层元素,最后的结果应该是一个二维数组

  5. 与此同时定义一个变量size来记录每一层队列的长度

    1. 由于我们在遍历树的时候在某一层会有两层元素混进来,所以这里的size至关重要,一定是要用变量保存的,因为下一层循环由于不同节点的元素情况不同可能导致size还在变动,所以下一层while循环的条件一定使用size存储的

    2. 这里的size可以告诉我们每一层有多少个元素,以及我们应该从队列弹出几个元素

102. 二叉树层序遍历

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        # create an array to store are final answer
        result = []

        # detemine the root is empty or not
        if not root:
            # we don't have root return empty array
            return result
        
        # create a queue
        queue = collections.deque([root])

        # traversal until the queue doesn't have any element
        while queue:
            # create a array store are each level elements
            level = []
            # use size to detemine which element belong to which level
            size = len(queue)

            # start record each level element
            for _ in range(size):
                # get first element in deque and pop it
                cur = queue.popleft()
                # store cur element into are level array
                level.append(cur.val)
                # detemine the left side is empty or not
                if cur.left:
                    # it's not empty, add this element into queue
                    queue.append(cur.left)
                # check right side
                if cur.right:
                    queue.append(cur.right)
            # let result store our level array
            result.append(level)
        
        # return our final result
        return result

学习完这一题后也剩下的这些题也可以一起做:

标签:node,遍历,val,self,层序,right,Day13,root,left
From: https://blog.csdn.net/NeighborKing/article/details/141539670

相关文章

  • 25版王道数据结构课后习题详细分析 第五章 树与二叉树 5.3 二叉树的遍历和线索二叉树
    一、单项选择题————————————————————————————————————————解析:二叉树中序遍历的最后一个结点一定是从根开始沿右子女指针链走到底的结点,设用p指示。若结点p不是叶结点(其左子树非空),则前序遍历的最后一个结点在它的左子树中,A、B......
  • ArrayList遍历, 元素查找
    1,ArrayList集合的遍历与数组类似,都可以使用foreach语句string[]str1={"a","b","c","d","e","f"};ArrayListList=newArrayList(str1);foreach(variteminList)......
  • 代码随想录第16天:513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造
    513.找树左下角的值,层序遍历//找树左下角的值,用层序遍历很容易实现#include<iostream>#include<queue>structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};//找到最底层......
  • 二叉树的前序遍历(递归和非递归)
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):val(x),left(nullptr),right(nullptr){}*......
  • 二叉树的先序遍历
    二叉树先序遍历(按照根-左-右次序访问节点)以下图为例:先序遍历序列应为:12489510367分别用递归算法和非递归算法得到上述例子的先序遍历序列(这里采用先序+为叶子节点添加‘-1’作为孩子节点来唯一确定一棵二叉树,非递归代码中,注意遍历过的结点加入栈中,这样当遍历完左子树......
  • set 的详细用法(set 排序、set 的遍历、set 的多种倒序遍历方法、set 的基本成员函数)
    目录一:set的简介二:set的使用(要包含头文件)1.set的定义2.set的基本成员函数3.set的遍历(1)迭代器iterator(即升序输出)(2)倒序输出1.rbegin()和rend()2.当然,也可以逆向思维一下。​^^3.用greater实现降序排列三:应用基本成员函数的代码【总结】有上述代码可以看出,插......
  • 批量图像识别的快速遍历技巧
    此文章来源于项目官方公众号:“AirtestProject”版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途一、前言最近,不少同学在Q群中频繁提出疑问:在日常UI测试过程中,如何快速准确地识别页面上的多个元素,或在日常测试中,如何高效地遍历目标图片列表,以确认画面中是否包......
  • df.iterrows() 是 Pandas 中的一个方法,用于在遍历 DataFrame 时,逐行返回每一行的索引
    df.iterrows()是Pandas中的一个方法,用于在遍历DataFrame时,逐行返回每一行的索引和数据。它生成一个迭代器,每次迭代时返回一个(index,Series)对,index是行索引,Series是该行的数据。详细解释df.iterrows():这个方法遍历DataFrame的每一行。每次迭代时,返回的是(ind......
  • 头歌 第4关:层次遍历二叉树
    任务描述本关任务:给定一棵二叉树,借助队列实现层次遍历二叉树。相关知识为了完成本关任务,你需要掌握:1.队列的类型定义及基本操作,2.二叉树层次遍历。队列的类型定义及基本操作队列的类型定义:#define MAXSIZE100  //最大长度typedefBiTNode*QElemType;//队列中......
  • 【Oracle】存储过程中将动态SQL的多行结果进行循环遍历
    【Oracle】存储过程中将动态SQL的多行结果进行循环遍历需求背景:有一段拼接出来的动态SQL,结果为多行,需要在函数或者存储过程中将其结果作为游标中的数据循环遍历出来以便后续数据操作使用动态SQL和隐式游标隐式游标不支持动态SQL的直接使用,但是可以通过EXECUTEIMMEDIATE来执行......