首页 > 其他分享 >二叉树遍历问题模板

二叉树遍历问题模板

时间:2024-02-15 11:56:15浏览次数:34  
标签:node 遍历 递归 二叉树 root stack 模板 result

在二叉树遍历问题中,有三种常见的遍历方式:前序遍历、中序遍历和后序遍历。以下是这三种遍历方式的递归模板:

1. 前序遍历(Preorder Traversal):

def preorderTraversal(root):
    if not root:
        return []
    
    result = []
    result.append(root.val)  # 处理当前节点
    result.extend(preorderTraversal(root.left))  # 递归处理左子树
    result.extend(preorderTraversal(root.right))  # 递归处理右子树
    
    return result

2. 中序遍历(Inorder Traversal):

def inorderTraversal(root):
    if not root:
        return []
    
    result = []
    result.extend(inorderTraversal(root.left))  # 递归处理左子树
    result.append(root.val)  # 处理当前节点
    result.extend(inorderTraversal(root.right))  # 递归处理右子树
    
    return result

3. 后序遍历(Postorder Traversal):

def postorderTraversal(root):
    if not root:
        return []
    
    result = []
    result.extend(postorderTraversal(root.left))  # 递归处理左子树
    result.extend(postorderTraversal(root.right))  # 递归处理右子树
    result.append(root.val)  # 处理当前节点
    
    return result

这些模板基于递归思想,对二叉树进行深度优先遍历。对于每个节点,都会首先处理当前节点,然后递归处理左子树和右子树。这样可以保证在遍历过程中按照前序、中序或后序的顺序访问节点。

在实际应用中,也可以使用迭代的方法,例如使用栈来模拟递归的过程,实现非递归的遍历。

迭代法模板
以下是使用迭代法进行二叉树遍历的模板。这里使用栈来模拟递归的过程,实现非递归的遍历。

1. 前序遍历(Preorder Traversal):

def preorderTraversal(root):
    if not root:
        return []

    result = []
    stack = [root]

    while stack:
        node = stack.pop()
        result.append(node.val)  # 处理当前节点

        if node.right:
            stack.append(node.right)  # 先加入右子树,因为栈是先入后出
        if node.left:
            stack.append(node.left)  # 再加入左子树

    return result

2. 中序遍历(Inorder Traversal):

def inorderTraversal(root):
    if not root:
        return []

    result = []
    stack = []

    while stack or root:
        while root:
            stack.append(root)
            root = root.left  # 先一直往左走到底,模拟递归的过程

        node = stack.pop()
        result.append(node.val)  # 处理当前节点
        root = node.right  # 处理右子树,如果右子树为空,下一次循环会继续处理栈中的节点

    return result

3. 后序遍历(Postorder Traversal):

def postorderTraversal(root):
    if not root:
        return []

    result = []
    stack = [root]

    while stack:
        node = stack.pop()
        result.insert(0, node.val)  # 插入到结果列表的开头,模拟逆序

        if node.left:
            stack.append(node.left)
        if node.right:
            stack.append(node.right)

    return result

这些迭代法的模板使用栈来辅助遍历,通过不断地迭代,模拟了递归的过程。这样可以在不使用递归的情况下实现二叉树的前序、中序和后序遍历。

其他优秀模板链接https://leetcode.cn/problems/binary-tree-preorder-traversal/solutions/642769/python3-die-dai-bian-li-chang-gui-jie-fa-1egc/
https://leetcode.cn/problems/binary-tree-preorder-traversal/solutions/247053/tu-jie-er-cha-shu-de-si-chong-bian-li-by-z1m/

标签:node,遍历,递归,二叉树,root,stack,模板,result
From: https://www.cnblogs.com/taixian/p/18016108

相关文章

  • 回溯算法模板
    回溯算法的模板通常包含递归函数和回溯过程。以下是一个通用的回溯算法模板:defbacktrack(start,path,other_parameters):#满足结束条件时,将当前路径加入结果ifsatisfies_end_condition:result.append(path[:])return#从start开始遍历可......
  • 模板
    01.模版的概念(了解)1.函数或类是通用,但是里面的数据类型的多种状态2.模版有:函数和类02.函数模版(重点)1.什么是函数模版函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板2.怎么编写函数模版//T代表泛型的......
  • 代码随想录算法训练营第十七天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶
    110.平衡二叉树 题目链接:110.平衡二叉树-力扣(LeetCode)思路:判断平衡二叉树,就是判断两个子树的高度差,继而问题转化为了如何求子树的高度——后序遍历(主要卡在了这里)。递归函数返回的是树的高度,同时用-1来表示退出递归(一开始想着用bool型作为返回值,发现函数不好设计)。同时要关......
  • 863. 二叉树中所有距离为 K 的结点
    首先要将二叉树转换成图,再用bfs做。1,二叉树转换成图用哈希表存当前节点和与其相连的点;通过当前节点于其父节点实现遍历;点击查看代码unordered_map<TreeNode*,vector<TreeNode*>>graph;voidcreateGraph(TreeNode*node,TreeNode*parent){if(!node)......
  • 1339. 分裂二叉树的最大乘积
    这道题关键突破点就是先算出节点总和,然后找到一颗子树总和最接近总和的一半。乘积最大基本就是先要求总和,然后找到最接近总和一半。关键就是这一步,找到最适合子树的和。点击查看代码if(abs(2*cur-sum)<abs(2*best-sum)){best=cur;}完整代码:点击查看......
  • P3367 【模板】并查集
    原题链接并查集模板练手。递归版本#include<bits/stdc++.h>usingnamespacestd;constintN=1e4+5;intfather[N];intfind(intmid){if(father[mid]!=mid){father[mid]=find(father[mid]);}returnfather[mid];}voidunion_fa(intx,inty){......
  • 二叉树层次建树+遍历
    1.BiTree层次建树实现使用二叉树的链式存储,必须要构造一个辅助链式队列,用pcur遍历树结点,实现代码如下:代码实现//二叉树层次建树+画图2024-02-12#include<iostream>#include<cstdio>usingnamespacestd;//树结点的数据结构typedefcharElemType;typedefstructT......
  • 力扣 递归 迭代 栈 广度 队列 之 226. 翻转二叉树
    给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]栈/** *Definitionforabinarytreenode. *publicclassTreeNode......
  • 623 在二叉树中增加一行
    深度遍历,就是遍历:1.先要确定有几种情况,像这道题,深度为1,2就是最基本的情况,分为两种处理;2.根据不同情况,进行不同处理,不需要考虑后面递归的传递。3.确认传递的方式,如果函数返回的是指针,就需要left,right接住。完整代码:点击查看代码classSolution{public:TreeNode*ad......
  • 力扣递归 深度优先搜索 之 104. 二叉树的最大深度
    给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。 示例1: 输入:root=[3,9,20,null,null,15,7]输出:3示例2:输入:root=[1,null,2]输出:2/** *Definitionforabinarytreenode. *publicclassTre......