首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用python实现树的遍历

在Python中实现树的遍历可以通过递归或迭代的方法来完成。树的遍历主要有三种方式:前序遍历(Pre-order Traversal)、中序遍历(In-order Traversal)和后序遍历(Post-order Traversal)。此外,还有层序遍历(Level-order Traversal),通常使用队列来实现。

以下是一个简单的二叉树节点类和各种遍历方法的实现:

定义二叉树节点类

代码语言:javascript
复制
class TreeNode:
    def __init__(self, value=0, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

前序遍历(Pre-order Traversal)

前序遍历的顺序是:根节点 -> 左子树 -> 右子树

递归实现

代码语言:javascript
复制
def pre_order_traversal(root):
    if root:
        print(root.value, end=' ')
        pre_order_traversal(root.left)
        pre_order_traversal(root.right)

迭代实现

代码语言:javascript
复制
def pre_order_traversal_iterative(root):
    if not root:
        return
    stack = [root]
    while stack:
        node = stack.pop()
        print(node.value, end=' ')
        if node.right:
            stack.append(node.right)
        if node.left:
            stack.append(node.left)

中序遍历(In-order Traversal)

中序遍历的顺序是:左子树 -> 根节点 -> 右子树

递归实现

代码语言:javascript
复制
def in_order_traversal(root):
    if root:
        in_order_traversal(root.left)
        print(root.value, end=' ')
        in_order_traversal(root.right)

迭代实现

代码语言:javascript
复制
def in_order_traversal_iterative(root):
    stack = []
    current = root
    while stack or current:
        while current:
            stack.append(current)
            current = current.left
        current = stack.pop()
        print(current.value, end=' ')
        current = current.right

后序遍历(Post-order Traversal)

后序遍历的顺序是:左子树 -> 右子树 -> 根节点

递归实现

代码语言:javascript
复制
def post_order_traversal(root):
    if root:
        post_order_traversal(root.left)
        post_order_traversal(root.right)
        print(root.value, end=' ')

迭代实现

代码语言:javascript
复制
def post_order_traversal_iterative(root):
    if not root:
        return
    stack1 = [root]
    stack2 = []
    while stack1:
        node = stack1.pop()
        stack2.append(node)
        if node.left:
            stack1.append(node.left)
        if node.right:
            stack1.append(node.right)
    while stack2:
        node = stack2.pop()
        print(node.value, end=' ')

层序遍历(Level-order Traversal)

层序遍历的顺序是按层级顺序从上到下,从左到右。

迭代实现

代码语言:javascript
复制
from collections import deque

def level_order_traversal(root):
    if not root:
        return
    queue = deque([root])
    while queue:
        node = queue.popleft()
        print(node.value, end=' ')
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)

示例

以下是一个示例,展示如何创建一个二叉树并进行各种遍历:

代码语言:javascript
复制
if __name__ == "__main__":
    # 创建一个示例二叉树
    #       1
    #      / \
    #     2   3
    #    / \   \
    #   4   5   6
    root = TreeNode(1)
    root.left = TreeNode(2)
    root.right = TreeNode(3)
    root.left.left = TreeNode(4)
    root.left.right = TreeNode(5)
    root.right.right = TreeNode(6)

    print("Pre-order Traversal (Recursive):")
    pre_order_traversal(root)
    print("\nPre-order Traversal (Iterative):")
    pre_order_traversal_iterative(root)

    print("\nIn-order Traversal (Recursive):")
    in_order_traversal(root)
    print("\nIn-order Traversal (Iterative):")
    in_order_traversal_iterative(root)

    print("\nPost-order Traversal (Recursive):")
    post_order_traversal(root)
    print("\nPost-order Traversal (Iterative):")
    post_order_traversal_iterative(root)

    print("\nLevel-order Traversal:")
    level_order_traversal(root)

运行上述代码将输出:

代码语言:javascript
复制
Pre-order Traversal (Recursive):
1 2 4 5 3 6 
Pre-order Traversal (Iterative):
1 2 4 5 3 6 
In-order Traversal (Recursive):
4 2 5 1 3 6 
In-order Traversal (Iterative):
4 2 5 1 3 6 
Post-order Traversal (Recursive):
4 5 2 6 3 1 
Post-order Traversal (Iterative):
4 5 2 6 3 1 
Level-order Traversal:
1 2 3 4 5 6 

这些方法展示了如何在Python中实现树的各种遍历方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL实现遍历

经常在一个表中有父子关系两个字段,比如empno与manager,这种结构中需要用到遍历。...生活580',-1),          (16,'左上幻灯片',13),          (17,'帮忙',14),          (18,'栏目简介',17);   二、利用临时表和递归过程实现遍历...(mysqlUDF不能递归调用): [c-sharp] DELIMITER $$   USE `db1`$$   -- 从某节点向下遍历子节点   -- 递归生成临时表数据   DROP...因为mysql对动态游标的支持不够,所以要想做成通用过程或函数比较困难,可以利用两个临时表来转换(同时去掉了递归调用),是个相对通用实现。 2....目前来看无论哪种实现,效率都不太好,希望mysql自己能实现oracle connect by 功能,应该会比较优化。 参考:MySQL中进行树状所有子节点查询

1.7K80
  • 使用 Python 遍历目录方法

    假设有这样一个任务,希望对某个文件夹(包括所有子文件夹与文件)中所有文件进行处理。这就需要遍历整理目录, 处理遇到每个文件。...import os ''' 遍历目录 ''' for folder_name,sub_folders,filenames in os.walk('F:\dicts'): print('当前文件夹:'...然后我们就可以在一个 for 循环语句中使用 os.walk() 函数,遍历这个文件夹整个目录。 os.walk() 在每次循环迭代过程中,会返回 3个值: 当前文件夹名称,字符串形式 。...ps:下面给大家介绍下Python os.walk() 函数 函数简介 os.walk() 函数用于在目录遍历所有的文件及文件夹。...) 总结 到此这篇关于使用 Python 遍历目录方法文章就介绍到这了,更多相关python 遍历目录内容请搜索ZaLou.Cn以前文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn

    2.2K30

    python 实现二叉深度 & 广度优先遍历

    什么是 一棵 在计算器科学中,(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型数据结构,用来模拟具有树状结构性质数据集合。...; 度:一棵中,最大节点度称为度; 叶节点或终端节点:度为零节点; 非终端节点或分支节点:度不为零节点; 父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点父节点; 孩子节点或子节点...森林:由m(m>=0)棵互不相交集合称为森林; 什么是二叉 二叉:每个节点最多含有两个子树称为二叉; 完全二叉:对于一颗二叉,假设其深度为d(d>1)。...除了第d层外,其它各层节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样二叉被称为完全二叉; 完全二叉 满二叉:所有叶节点都在最底层完全二叉; 满二叉 深度优先 深度优先遍历即是先按深度来遍历二叉...这里唠叨一下,数据结构与算很重要,很多东西实现都少不了数据结构与算法,就如 mysql 实现就用到了 B+ ,如果我们懂其中原理,对数据库性能优化会有很大帮助。

    85620

    二叉实现以及遍历算法实现python

    python实现一个二叉,以下是实现二叉图形样本: ?...= Node('A',Node('B',Node('E',Node('H'),Node('I'))),Node('C',Node('F'),Node('G',Node('J')))); 这样一个简单二叉实现了...接下来该实现广度优先遍历和深度优先遍历算法了。 先看一下这两种遍历方法区别。 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止。...然后回溯到前一个节点,进行右子树节点遍历,直到遍历完所有可达节点为止。 广度优先遍历:从根节点出发,在横向遍历二叉层段节点基础上纵向遍历二叉层次。...从实现角度考虑,深度优先遍历可以采用递归,而广度优先就需要借助于先进先出数据结构来实现了。

    54030

    Python实现数据结构之

    如果除了最下面的一层节点,其余节点组成是一颗满二叉,并且最下面的这层节点遵循从左到右依次添加顺序,那么这个就叫做完全二叉 非空完全二叉中,外部节点数=内部节点数+1 二叉实现可以以继承抽象类方式实现...但是我们还需要掌握一个算法,就是遍历算法 遍历 遍历一般有先序遍历,后序遍历,广度优先遍历(层序遍历),对于二叉还有中序遍历 先序遍历 先序遍历是按照根节点->从左到右孩子节点顺序遍历...python实现先序遍历为: def preorder(self,p): """ 先序遍历节点p为根节点 """ yield p for c in self.children...python实现: def postorder(self,p): """ 后序遍历节点p为根 """ for c in self.children(p):...python实现: def breadthfirst(self): if not self.is_empty(): queue = Queue() queue.enqueue

    1.1K20

    图解栈数据结构对遍历

    请点击上方蓝字,免费添加公众号,一起进步吧! “ 图解栈数据结构对前序遍历,中序遍历,后续遍历。”...01 — 遍历 所谓遍历 (Traversal) 是指沿着某条搜索路线,依次对中每个结点均做一次且仅做一次访问。访问结点所做操作依赖于具体应用问题。...02 — 二叉遍历 本文以二叉遍历为例总结。 二叉由根结点及左、右子树这三个基本部分组成。...(栈结构实现) 前序遍历 Preorder Traversal :先访问根结点,然后访问根节点左子树,最后访问根节点右子树。...给定如下图所示二叉, ? 那么栈这种数据结构,如何前序遍历这颗二叉呢? 首先,我们把代码放在这里,然后分析这个代码是怎么想出来

    845110

    遍历总结

    注意所有的遍历走过了路径都是相同,只是输出(操作)延迟问题,也可以在依靠遍历回溯完成操作,递归操作是对当前节点不同状态下不同情况考虑,不需要考虑上下父子关系 判断是不是二茬排序 // 使用包装类可以传入数值为...二叉遍历都是可以栈来进行模拟,因为递归就是在jvm中内部栈进行操作 public List inorderTraversal(TreeNode root) {...// 使用 双队列交换实现层次遍历 public List> levelOrder(TreeNode root) { List<List<Integer.../ 使用 双栈交换实现层次遍历 public List> zigzagLevelOrder(TreeNode root) { List<List<...// -1来表明是不平衡二叉,直接返回-1,相当于对高度算法进行了剪枝 // 使用-1代表不平衡 public boolean isBalanced2(TreeNode root

    1.7K30

    二叉建立以及遍历多种实现(python版)

    二叉是很重要数据结构,在面试还是日常开发中都是很重要角色。 首先是建立过程,对比C或是C++实现来讲,其涉及到了较为复杂指针操作,但是在面向对象语言中,就不需要考虑指针, 内存等。...= lchild # 表示左子树 self.rchild = rchild # 表示右子树 self.data = data # 表示数据域 建立实现有两种,...遍历建树与层次建树,这两种分别是基于堆栈和队列来实现,先来看看最基本递归建树。...三序遍历就不用说了,基于递归,很好理解,那么基于队列以及堆栈遍历呢?...完整代码: ''' 二叉建立及实现 (递归与非递归) ''' from collections import deque # 树节点定义 class Node: def __init_

    43520

    二叉遍历算法递归实现+层次遍历

    二叉遍历算法 二叉存储结构 typedef struct BTNode { char data; //这里默认结点data为char型 struct BTNode *lchild...; struct BTNode *rchild; }BTNode; 二叉遍历算法 1 先序遍历 先序遍历操作如下。...如果二叉为空,则什么都不做;否则: 1)访问根节点 2)先序遍历左子树 3)先序遍历右子树 描述如下: void preorder(BTNode *p) { if(p !...后序遍历操作如下。..." /> 上图所示为二叉层次遍历,即按照箭头所指方向,按照1、2、3、4层次顺序,对二叉中各个结点进行访问(此图反映是自左至右层次遍历,自右至左方式类似) 要进行层次遍历,需要建立一个循环队列先将二叉头结点入队列

    1.4K00
    领券