首页
学习
活动
专区
工具
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);   二、利用临时表和递归过程实现树的遍历...(mysql的UDF不能递归调用): [c-sharp] DELIMITER $$   USE `db1`$$   -- 从某节点向下遍历子节点   -- 递归生成临时表数据   DROP...因为mysql对动态游标的支持不够,所以要想做成通用的过程或函数比较困难,可以利用两个临时表来转换(同时去掉了递归调用),是个相对通用的实现。 2....目前来看无论哪种实现,效率都不太好,希望mysql自己能实现oracle 的connect by 功能,应该会比较优化。 参考:MySQL中进行树状所有子节点的查询

1.7K80
  • 二叉树实现以及遍历算法实现(python)

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

    54230

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

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

    87720

    图解用栈数据结构对树的遍历

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

    855110

    用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

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

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

    46220

    树的遍历总结

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

    1.7K30

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

    二叉树遍历算法 二叉树的存储结构 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

    树, 树的遍历, 树的数据结构

    ,如果不使用指针其实根本没有办法感受这几种数据结构的原理,所以这里就是用 C 语言来实现几种简单的数据结构.树数据结构中的树其实非常简单,就是类似金字塔从树干到树的下层.上图就是一个简单的二叉树的结构...,我们可以用 c 语言简单写一个小如何表示.struct Tree{ int value; Tree *left; Tree *right;}*tree;二叉树的遍历二叉树遍历分为层序遍历和深度遍历...,对应就是深度搜索和广度搜索,其中深度搜索有包含前序遍历后序遍历和中序遍历,就是遍历根节点的顺序不同,这里只写一个前序遍历.show me the code前序遍历void frontedSearch(...,其中最知名的就是红黑树,关于红黑树的操作较为复杂,这里就不写代码实现了,而递归树就是我们使用递归的时候逻辑图,虽然实际上的是通过每个函数的栈地址不断跳转实现,但是其中实现远离可以类似一个树状结构.关于树的变形其实还有很多...,今天只是最简单的一部分,后续结合我们操作的话一个是结合对应算法操作,另外就是实现一下对应数据结构的操作代码.

    5700
    领券