python 2叉树,二叉树遍历python代码

  python 2叉树,二叉树遍历python代码

  Binarytree库是Python的第三方库。这个库实现了一些与二叉树相关的常用方法。使用二叉树的时候可以直接调用,不需要自己实现。下面文章主要介绍Python第一次实战二叉树知识的相关信息。有需要的朋友可以参考一下。

  00-1010第三方库binarytree二叉树节点函数Node()二叉树方法和属性build()build2()bst() heap()获取父节点函数get_parent()的摘要

  

目录

 

  其使用环境、安装方法、二叉树等相关知识请参考:《Python 初识二叉树,新手也秒懂!》。

  如果不能导入,请安装:pip install binarytree

  安装完成后,导入库:导入binarytree

  的主要功能方法如下:

  将binarytree作为bt导入

  bt。__全部_ _

  [Node , tree , bst , heap , build , build2 , get_parent , __version__]

  bt。__版本_ _

  6.3.0

  最新版本V6.3.0,挑选其中几个来探索二叉树的世界:

  

第三方库 binarytree

 

  Prototype: node (nodevalue,leftchildnode=none,leftchildnode=none)

  三个参数:NodeValue节点值,必须是实数、int或float。

  LeftChildNode,LeftChildNode左右子树节点

  通过创建节点,生成具有3层的完整二叉树:

  从二进制树导入节点

  bt=节点(1)

  bt.left=节点(2)

  bt.right=Node(3)

  bt.left.left=节点(4)

  bt.left.right=节点(5)

  bt.right.left=节点(6)

  bt.right.right=Node(7)

  bt.pprint()

  __1__

  /

  2 3

  //

  4 5 6 7

  如果要构建一个有很多层的完整二叉树,用Node()逐个赋值有点麻烦。例如,对于第四层,为8片叶子赋值:

  bt.left.left.left=节点(8)

  bt.left.right.left=节点(10)

  bt.right.left.left=节点(12)

  bt.right.right.left=节点(14)

  bt.left.left.right=节点(9)

  bt.left.right.right=Node(11)

  bt.right.left.right=Node(13)

  bt.right.right.right=节点(15)

  为了方便起见,我想到了用exec()函数把字符串转换成变量来简化代码。自定义函数创建

  ePerfectTree(intTreeLevels, listTreeData),参数为需要指定的层数和节点赋值数据,分别是整数和列表类型;函数返回值为一个满二叉树。代码如下:

  

from binarytree import Node

 

  运行结果:

  

None

1


1
/
2 3


__1__
/
2 3
/ /
4 5 6 7


________1________
/
__2___ ___3___
/ /
4 _5 _6 _7
/ / / /
8 9 10 11 12 13 14 15


____________________1____________________
/
________2_________ _________3_________
/ /
___4___ ____5___ ____6___ ____7___
/ / / /
_8 _9 _10 _11 _12 _13 _14 _15
/ / / / / / / /
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31


____________________________________________1____________________________________________
/
____________________2_____________________ _____________________3_____________________
/ /
_________4_________ __________5_________ __________6_________ __________7_________
/ / / /
____8___ ____9___ ____10___ ____11___ ____12___ ____13___ ____14___ ____15___
/ / / / / / / /
_16 _17 _18 _19 _20 _21 _22 _23 _24 _25 _26 _27 _28 _29 _30 _31
/ / / / / / / / / / / / / / / /
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63


__15__
/
0 7
/ /
2 6 4 3


______15_______
/
__0__ ___7___
/ /
2 6 4 _3
/ / / /
1 5 6 7 9 34 23 8

None

________1________
/
__2___ ___3___
/ /
4 _5 _6 _7
/ / / /
8 9 10 11 12 13 14 15

 

  

 

  嵌套创建节点,顺便判断对称性。得到一个结论:属性.is_symmetric判断的对称是指镜像对称,不是根节点的左右子树要完全相等,而是要镜面反向才返回 True。

  

>>> from binarytree import Node

 

  

 

  

二叉树的方法与属性

 

  1. 列印方法bt.pprint() 等同于print(bt)

  

# 以下所有举例皆用上面代码中的 root 满二叉树:

 

  2. 判断类属性,判断二叉树是否平衡、严格、对称、完全、完美,是否为最大(小)堆、搜索树等

  对称是指根节点的左右子树呈镜像对称;严格是指除叶子外所有节点都有左右两个节点。

  

>>> root.is_balanced

 

  3. 数量数值类属性

  

>>> root.left

 

  注: val和value等价,values和values2差别在于如有多个连续空节点时后者只返回一个None

  4. 属性字典,打包了上面两大类属性中的一部分放在一个字典里

  

>>> root.properties

 

  5. 遍历类

  

>>> root.preorder

 

  6. .svg() 二叉树的矢量图

  

>>> root.svg()

 

  可以输出后缀为.svg 的文本文件,一种矢量图的超文本表达文件,大部分浏览器可以直接查看;也可下载Inkscape 等软件来编辑。输出效果如下:

  

 

  7. .clone() 克隆一棵二叉树的全部或者部分

  

>>> from binarytree import tree

 

  8. .validate() 判断二叉树是否有效,正常返回None,有三种情况会抛出相应错误:

  NodeTypeError: 如果节点不是Node(i)

  NodeValueError: 如果节点值不是数字,如Node(i)中的参数i不为int或float

  noderReferenceError: 如果二叉树中存在对节点的循环引用

  随机二叉树函数 tree()

  指定层数,随机创建一棵二叉树。

  函数原型:tree(height: int = 3, is_perfect: bool = False)

  两个参数:层数height, 范围 0 ~ 9,最多创建 9 层,缺省值 3

  是否满二叉树is_perfect,缺省值False,即非满二叉树

  创建几个随机二叉树吧:

  

>>> import binarytree as bt

 

  创建一个3层随机的满二叉树,再用正整数序列赋值到每个节点

  

>>> from binarytree import tree

 

  或者其它层数的:

  

import binarytree as bt

 

  给满二叉树仿房间号赋值:

  

import binarytree as bt

 

  用指定列表赋值给满二叉树:

  

>>> from binarytree import tree

 

  给非满二叉树赋值:

  

>>> from binarytree import tree

 

  使用上面用到过的办法来依葫芦画瓢,结果程序出错。

  原因在于:非满二叉树相对于满二叉树缺失的节点索引号是跳空的。

  正如上面的测试所示:root[2],root[4]之间的 root[3]并不存在。代码修改如下:

  

>>> from binarytree import tree

 

  续上面的节点结构,重新赋值使得层序遍历出的数值连续:

  

>>> t = 0

 

  

 

  

用列表创建二叉树的函数 build()

 

  函数原型:build(values: List[Union[float, int]])

  一个参数:实数组成的列表

  上面操练Node(),tree()函数时,都练习过用指定列表给二叉树赋值。那只是为了操练而操练的,因为用build()函数非常方便,一步到位:

  

>>> from binarytree import build

 

  列表元素个数少于节点数时,后面的叶子自动为空:

  

>>> from binarytree import build

 

  树中间的节点为空,只要把列表对应的元素置为None:

  

>>> from binarytree import build

 

  注:给定列表的0号索引的元素一定不能为空,根节点为空列表之后元素将无处安放。另外已经置空的节点下的对应索引号也要置为None,如上面的root根节点下没 root.right.right 节点的, 所以如果要给data增加非None元素的话,程序也会出错。测试代码如下:

  

>>> from binarytree import build

 

  

 

  

build2()

 

  用法基本与build()相同,但它的参数允许更紧凑的列表,因为它的同一层节点中如果最后连续为空只要一个None。两者的区别有点像上面在二叉树方法属性一节里提到的(已红色标注):values 和 values2的区别。请看如下测试代码:

  

>>> root1 = build([2, 5, None,3,None,None, None, 1, 4])

 

  

 

  

bst() heap()

 

  用法基本上与 tree() 相同,参数也是:层数(0~9); is_perfect = False(默认值)
返回值:分别是特殊的二叉树 bst 和 heap;另heap()多一个参数is_max = True(默认值)

  

>>> from binarytree import bst

 

  tree() 也能造出bst 和 heap 来,只是用循环来多花点时间:

  

>>> from binarytree import bst, heap

 

  

 

  

获取双亲节点函数 get_parent()

 

  get_parent(root: binarytree.Node, child: binarytree.Node)

  给定子节点,返回它在根节点下的上一层级的节点

  

>>> from binarytree import tree, get_parent

 

  

 

  

总结

 

  到此这篇关于Python初识二叉树续之实战binarytree的文章就介绍到这了,更多相关Python实战binarytree内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: