python二叉树类以及其4种遍历方法实例

目录
  • 前言
  • 实例代码:
  • 相关阅读内容:
  • 总结

前言

之前学习过binarytree第三方库,了解了它定义的各种基本用法。

昨天在问答频道中做题时碰到一个关于二叉树的算法填空题,感觉代码不错非常值得学习,于是整理代码分享如下:

实例代码:

from collections import deque  #层遍历中用到队列数据类型

class BTNode:   #二叉链中结点类
    def __init__(self,d = None):
        self.data = d       #结点值
        self.lchild = None  #左hai子指针
        self.rchild = None  #右hai子指针

class BTree: #二叉树类
    def __init__(self,d = None):
        self.b = None       #根结点指针

    def DispBTree(self):    #返回二叉链的括号表示串
        return self._DispBTree1(self.b)

    def _DispBTree1(self,t):    #被DispBTree方法调用
        if t==None:             #空树返回空串
            return ""
        else:
            bstr = t.data       #输出根结点值
            if t.lchild != None or t.rchild != None:
                bstr += "("     #有hai子结点时输出"("
                bstr += self._DispBTree1(t.lchild)    #递归输出左子树
            if t.rchild != None:
                bstr += ","     #有右hai子结点时输出","
                bstr += self._DispBTree1(t.rchild)    #递归输出右子树
                bstr += ")"     #输出")"
        return bstr

    def FindNode(self,x):       #查找值为x的结点算法
        return self._FindNode1(self.b,x)

    def _FindNode1(self,t,x):   #被FindNode方法调用
        if t==None:
            return None         #t为空时返回null
        elif t.data==x:
            return t            #t所指结点值为x时返回t
        else:
            p = self._FindNode1(t.lchild,x)    #在左子树中查找
        if p != None:
            return p            #在左子树中找到p结点,返回p
        else:
            return self._FindNode1(t.rchild,x)  #返回在右子树中查找结果

    def Height(self):           #求二叉树高度的算法
        return self._Height1(self.b)

    def _Height1(self,t):       #被Height方法调用
        if t==None:
            return 0            #空树的高度为0
        else:
            lh = self._Height1(t.lchild)    #求左子树高度lchildh
            rh = self._Height1(t.rchild)    #求右子树高度rchildh
        return max(lh,rh)+1

def PreOrder(bt):   #先序遍历的递归算法
    _PreOrder(bt.b)

def _PreOrder(t):   #被PreOrder方法调用
    if t != None:
        print(t.data,end = ' ')     #访问根结点
        _PreOrder(t.lchild)         #先序遍历左子树
        _PreOrder(t.rchild)         #先序遍历右子树

def InOrder(bt):    #中序遍历的递归算法
    _InOrder(bt.b)

def _InOrder(t):    #被InOrder方法调用
    if t != None:
        _InOrder(t.lchild)          #中序遍历左子树
        print(t.data,end = ' ')     #访问根结点
        _InOrder(t.rchild)          #中序遍历右子树

def PostOrder(bt):  #后序遍历的递归算法
    _PostOrder(bt.b)

def _PostOrder(t):  #被PostOrder方法调用
    if t != None:
        _PostOrder(t.lchild)        #后序遍历左子树
        _PostOrder(t.rchild)        #后序遍历右子树
        print(t.data,end = ' ')     #访问根结点

def LevelOrder(bt): #层序遍历的算法
    qu = deque()            #将双端队列作为普通队列qu
    qu.append(bt.b)         #根结点进队
    while len(qu)>0:        #队不空循环
        p = qu.popleft()            #出队一个结点
        print(p.data,end = ' ')     #访问p结点
        if p.lchild != None:        #有左hai子时将其进队
            qu.append(p.lchild)
        if p.rchild != None:        #有右hai子时将其进队
            qu.append(p.rchild)

def CreateBTree2(posts,ins):        #由后序序列posts和中序序列ins构造二叉链
    bt = BTree()
    bt.b = _CreateBTree2(posts,0,ins,0,len(posts))
    return bt

def _CreateBTree2(posts,i,ins,j,n):
    if n <= 0:
        return None
    d = posts[i+n-1]        #取后序序列尾元素d
    t = BTNode(d)           #创建根结点(结点值为d)
    p = ins.index(d)        #在ins中找到根结点的索引
    k = p-j                 #确定左子树中结点个数k
    t.lchild = _CreateBTree2(posts,i,ins,j,k)           #递归构造左子树
    t.rchild = _CreateBTree2(posts,i+k,ins,p+1,n-k-1)   #递归构造右子树
    return t

if __name__ == '__main__':

    inlst = ['D','G','B','A','E','C','F']
    posts = ['G','D','B','E','F','C','A']

    print(f"中序列表 :{inlst}")
    print(f"后序列表 :{posts}")

    #构造二叉树bt
    bt = BTree()
    bt = CreateBTree2(posts,inlst)
    print(f"\n构造二叉树:{bt.DispBTree()}")

    x = 'F'
    if bt.FindNode(x):
        print(f"bt中存在 :'{x}'")
    else:
        print(f"bt中不存在 :'{x}'")

    print(f"bt的高度 :{bt.Height():^3}")

    print("\n先序遍历 :",end='')
    PreOrder(bt)
    print("\n中序遍历列 :",end='')
    InOrder(bt)
    print("\n后序遍历 :",end='')
    PostOrder(bt)
    print("\n层序遍历 :",end='')
    LevelOrder(bt)

中序列表:['D', 'G', 'B', 'A', 'E', 'C', 'F']
后序列表:['G', 'D', 'B', 'E', 'F', 'C', 'A']

构造二叉树:A(B(D(,G),C(E,F))
bt中存在 :'F'
bt的高度 : 4

先序遍历 :A B D G C E F 
中序遍历 :D G B A E C F 
后序遍历 :G D B E F C A 
层序遍历 :A B C D E F G

相关阅读内容:

  • Python 初识二叉树,新手也秒懂!
  • Python 初识二叉树,新手也秒懂!(续:实战binarytree)

总结

到此这篇关于python二叉树类以及其4种遍历方法的文章就介绍到这了,更多相关python二叉树类遍历内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python编程实现二叉树及七种遍历方法详解

    本文实例讲述了Python实现二叉树及遍历方法.分享给大家供大家参考,具体如下: 介绍: 树是数据结构中非常重要的一种,主要的用途是用来提高查找效率,对于要重复查找的情况效果更佳,如二叉排序树.FP-树.另外可以用来提高编码效率,如哈弗曼树. 代码: 用Python实现树的构造和几种遍历算法,虽然不难,不过还是把代码作了一下整理总结.实现功能: ① 树的构造 ② 递归实现先序遍历.中序遍历.后序遍历 ③ 堆栈实现先序遍历.中序遍历.后序遍历 ④ 队列实现层次遍历 #coding=utf-8 cl

  • python先序遍历二叉树问题

    问题 如何遍历一个二叉树 遍历二叉树就是访问二叉树的每一个节点 二叉树父结点下先左访问,先序遍历(根左右) 例如:遍历以下的二叉树 遍历结果:ABDECF Python代码示例 # !/usr/bin/env python # -*-encoding: utf-8-*- # author:LiYanwei # version:0.1 class TreeNode(object): ''' 二叉树类 ''' def __init__ (self, data, left = None, right

  • Python利用前序和中序遍历结果重建二叉树的方法

    本文实例讲述了Python利用前序和中序遍历结果重建二叉树的方法.分享给大家供大家参考,具体如下: 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 这道题比较容易,前序遍历的结果中,第一个结点一定是根结点,然后在中序遍历的结果中查找这个根结点,根结点左边的就是左子树,根结点右边的就是右子树,递归构造出左.右子树即可.示意图如图所示: 利用前序和中序遍历的结果重建二叉树 Python代码: # coding: utf-8 ''

  • python实现的二叉树定义与遍历算法实例

    本文实例讲述了python实现的二叉树定义与遍历算法.分享给大家供大家参考,具体如下: 初学python,需要实现一个决策树,首先实践一下利用python实现一个二叉树数据结构.建树的时候做了处理,保证建立的二叉树是平衡二叉树. # -*- coding: utf-8 -*- from collections import deque class Node: def __init__(self,val,left=None,right=None): self.val=val self.left=l

  • Python实现二叉树的常见遍历操作总结【7种方法】

    本文实例讲述了Python实现二叉树的常见遍历操作.分享给大家供大家参考,具体如下: 二叉树的定义: class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None 二叉树的前序遍历 递归 def preorder(root,res=[]): if not root: return res.append(root.val) preorder(root.left,res) preorder

  • python数据结构之二叉树的遍历实例

    遍历方案   从二叉树的递归定义可知,一棵非空的二叉树由根结点及左.右子树这三个基本部分组成.因此,在任一给定结点上,可以按某种次序执行三个操作:   1).访问结点本身(N)   2).遍历该结点的左子树(L)   3).遍历该结点的右子树(R) 有次序:   NLR.LNR.LRN 遍历的命名 根据访问结点操作发生位置命名:NLR:前序遍历(PreorderTraversal亦称(先序遍历))  --访问结点的操作发生在遍历其左右子树之前.LNR:中序遍历(InorderTraversal)

  • python实现二叉树的遍历

    本文实例为大家分享了python实现二叉树的遍历具体代码,供大家参考,具体内容如下 代码: # -*- coding: gb2312 -*- class Queue(object): def __init__(self): self.q = [] def enqueue(self, item): self.q.append(item) def dequeue(self): # if self.q != []: if len(self.q)>0: return self.q.pop(0) else

  • python二叉树遍历的实现方法

    复制代码 代码如下: #!/usr/bin/python# -*- coding: utf-8 -*- class TreeNode(object):    def __init__(self,data=0,left=0,right=0):        self.data = data        self.left = left        self.right = right class BTree(object):    def __init__(self,root=0):     

  • python二叉树类以及其4种遍历方法实例

    目录 前言 实例代码: 相关阅读内容: 总结 前言 之前学习过binarytree第三方库,了解了它定义的各种基本用法. 昨天在问答频道中做题时碰到一个关于二叉树的算法填空题,感觉代码不错非常值得学习,于是整理代码分享如下: 实例代码: from collections import deque #层遍历中用到队列数据类型 class BTNode: #二叉链中结点类 def __init__(self,d = None): self.data = d #结点值 self.lchild = No

  • java实现二叉树的创建及5种遍历方法(总结)

    用java实现的数组创建二叉树以及递归先序遍历,递归中序遍历,递归后序遍历,非递归前序遍历,非递归中序遍历,非递归后序遍历,深度优先遍历,广度优先遍历8种遍历方式: package myTest; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Stack; public class myClass { public static void main(

  • Python定义二叉树及4种遍历方法实例详解

    本文实例讲述了Python定义二叉树及4种遍历方法.分享给大家供大家参考,具体如下: Python & BinaryTree 1. BinaryTree (二叉树) 二叉树是有限个元素的集合,该集合或者为空.或者有一个称为根节点(root)的元素及两个互不相交的.分别被称为左子树和右子树的二叉树组成. 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒. 二叉树的第i层至多有2^{i-1}个结点 深度为k的二叉树至多有2^k-1个结点: 对任何一棵二叉

  • Python 列表(List) 的三种遍历方法实例 详解

    Python 遍历 最近学习python这门语言,感觉到其对自己的工作效率有很大的提升,下面废话不多说,直接贴代码 #!/usr/bin/env python # -*- coding: utf-8 -*- if __name__ == '__main__': list = ['html', 'js', 'css', 'python'] # 方法1 print '遍历列表方法1:' for i in list: print ("序号:%s 值:%s" % (list.index(i)

  • java 完全二叉树的构建与四种遍历方法示例

    本来就是基础知识,不能丢的太干净,今天竟然花了那么长的时间才写出来,记一下. 有如下的一颗完全二叉树: 先序遍历结果应该为:1  2  4  5  3  6  7 中序遍历结果应该为:4  2  5  1  6  3  7 后序遍历结果应该为:4  5  2  6  7  3  1 层序遍历结果应该为:1  2  3  4  5  6  7 二叉树的先序遍历.中序遍历.后序遍历其实都是一样的,都是执行递归操作. 我这记录一下层次遍历吧:层次遍历需要用到队列,先入队在出队,每次出队的元素检查是其是

  • Map获取键值,Map的几种遍历方法总结(推荐)

    Map获取键值 Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象. Map的接口 Map---实现Map Map.Entry--Map的内部类,描述Map中的按键/数值对. SortedMap---扩展Map,使按键保持升序排列 关于怎么使用,一般是选择Map的子类,而不直接用Map类. 下面以HashMap为例 public static void main(String args[]) { HashMap hashmap =new HashMap();

  • Java完全二叉树的创建与四种遍历方法分析

    本文实例讲述了Java完全二叉树的创建与四种遍历方法.分享给大家供大家参考,具体如下: 有如下的一颗完全二叉树: 先序遍历结果应该为:1  2  4  5  3  6  7 中序遍历结果应该为:4  2  5  1  6  3  7 后序遍历结果应该为:4  5  2  6  7  3  1 层序遍历结果应该为:1  2  3  4  5  6  7 二叉树的先序遍历.中序遍历.后序遍历其实都是一样的,都是执行递归操作. 我这记录一下层次遍历吧:层次遍历需要用到队列,先入队在出队,每次出队的元素

  • python中使用iterrows()对dataframe进行遍历的实例

    假设我们有一个很简单的OTU表: 现在对这个表格进行遍历,一般写法为: import pandas as pd otu = pd.read_csv("otu.txt",sep="\t") for index,row in otu.iterrows(): print index print row 这里的iterrows()返回值为元组,(index,row) 上面的代码里,for循环定义了两个变量,index,row,那么返回的元组,index=index,row=

  • Python之字典对象的几种创建方法

    第一种方式:使用{} firstDict = {"name": "wang yuan wai ", "age" : 25} 说明:{}为创建一个空的字典对象 第二种方式:使用fromkeys()方法 second_dict = dict.fromkeys(("name", "age")) #value使用默认的None,也可以指定value值 说明:fromkeys()是dict类的一个staticmeth

  • python访问类中docstring注释的实现方法

    本文实例讲述了python访问类中docstring注释的实现方法.分享给大家供大家参考.具体分析如下: python的类注释是可以通过代码访问的,这样非常利于书写说明文档 class Foo: pass class Bar: """Representation of a Bar""" pass assert Foo.__doc__ == None assert Bar.__doc__ == "Representation of a B

随机推荐