二叉树(Binary Tree)时数据结构中一个非常重要的结构,其具有。。。。(此处省略好多字)。。。。等的优良特点。

之前在刷LeetCode的时候把有关树的题目全部跳过了,(ORZ:我这种连数据结构都不会的人刷j8Leetcode啊!!!)

所以 !!!敲黑板了!!!今天我就在B站看了数据结构中关于树的内容后,又用我浅薄的Python大法来实现一些树的建立和遍历。


关于树的建立我觉得层序建立对于使用者来说最为直观,输入很好写。(好吧,我是看LeetCode中的树输入都是采用层序输入觉得非常好)

树节点定义

代码来

class BSTreeNode(object):
def __init__(self, data):
self.val = data
self.leftChild = None
self.rightChild = None

这一段代码太好理解了好吧,就不BB了。

二叉树层序建立

不多说,先上代码

 # 建立二叉树是以层序遍历方式输入,节点不存在时以 'None' 表示
def creatTree(nodeList):
if nodeList[0] == None:
return None
head = BSTreeNode(nodeList[0])
Nodes = [head]
j = 1
for node in Nodes:
if node != None:
node.leftChild = (BSTreeNode(nodeList[j]) if nodeList[j] != None else None)
Nodes.append(node.leftChild)
j += 1
if j == len(nodeList):
return head
node.rightChild = (BSTreeNode(nodeList[j])if nodeList[j] != None else None)
j += 1
Nodes.append(node.rightChild)
if j == len(nodeList):
return head

creatTree即为层序建立二叉树的函数,传入的参数为一个层序遍历的数组,就是将树节点从左往右,从上往下一次放入数组中,如果某个节点不存在则用None来表示。

比如:

图所示的二叉树则需输入a = [1,2,3,4,5,None,6,None,None,7,8],接下来将会以这个二叉树为例讲解代码。

  • 第3-4行,判断根节点是否为空。 如果根节点都为空,那树(shuo)就(ge)不(j)存(8)在了,直接返回就好了。
  • 第行,将元素列表中的第一个元素取出新建根节点,最后返回的即为根节点
  • 第行,创建了一个Nodes列表中,用于存放树中的节点,每生成一个节点就将其放入该列表中,可以看成是一个队列(这么说好像也不是特别规范,因为后面只是取列表中的元素,没有弹出首元素),此处将根节点存入。
  • 第行,创建变量j用于nodeList中元素的索引,初始为1.因为第0个元素已经创建根节点了。
  • 第行,依次取出Nodes列表中的节点,对其创建左子节点和右子节点
  • 第行,首先判断取出的Nodes是否为空,如果为空,说明此处没有节点,就无需创建子节点,否则进行子节点的创建
  • 第行,为该节点创建左节点,其值就是索引j的所对应的值,如果nodeLists[j] == None 说明没有该子节点,就不用创建了,即Child = None
  • 第行,将新建的节点加入Nodes数组,使其在for循环中可以继续为其添加子节点
  • 第行,j加1,这样刚好使每一个nodeList的元素对应一个节点了
  • 第行,判断j的值,如果与nodeList值相等说明全部节点已经添加完毕了,直接返回head根节点就完成了树的建立
  • 第15-19行,为节点添加右节点,与添加左节点的逻辑是一样的,就不在赘述了

好了代码注释完毕,我们再通过结合实例来解释一下:

  •  nodeList = [1,2,3,4,5,None,6,None,None,7,8],下面节点统一用n(值)来表示
  • 建立根节点 head = n(1), j=1, len(nodeList) = 11
  • 开始for循环:Nodes = [n(1)]
    • node为n(1),非空

      • nodeList[j]=nodeList[1]=2 非空,所以新建节点n(2),n(1)的左节点即为n(2),新建节点放入Nodes, 则Nodes=[n(1),n(2)] j+1=2, j未溢出
      • nodeList[j]=nodeList[2]=3 非空,所以新建节点n(3),n(1)的右节点即为n(3),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3)], 然后j+1=3, j未溢出
    • node为n(2),非空
      • nodeList[j]=nodeList[3]=4 非空,所以新建节点n(4),n(2)的左节点即为n(4),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4)], j+1=4, j未溢出
      • nodeList[j]=nodeList[4]=5 非空,所以新建节点n(5),n(2)的右节点即为n(5),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5)], j+1=5, j未溢出
    • node为n(3),非空
      • nodeList[j]=nodeList[5]=None 为空,所以n(3)的左节点直接等于None, 同时将None也放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None] j+1=6, j未溢出
      • nodeList[j]=nodeList[6]=6 非空,所以新建节点n(6),n(3)的右节点即为n(6),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6)], j+1=7, j未溢出 
    • node为n(4),非空
      • nodeList[j]=nodeList[7]=None 为空,所以n(4)的左节点直接等于None,同时将None也放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None], j+1=8, j未溢出
      • nodeList[j]=nodeList[8]=None 为空,所以n(4)的右节点直接等于None,同时将None也放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None,None], j+1=9, j未溢出
    • node为n(5), 非空
      • nodeList[j]=nodeList[9]=7 非空,所以新建节点n(7),n(5)的左节点即为n(7),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None,None,n(9)] j+1=10, j未溢出
      • nodeList[j]=nodeList[10]=8 非空,所以新建节点n(8),n(5)的右节点即为n(8),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None,None,n(9),n(10)] j+1=11, j溢出
  • j溢出,则返回head根节点,结束二叉树的建立

  PS:如果node为空节点的话,就会直接跳过空节点。

二叉树遍历(神用的递归)

1. 前序遍历

#head为二叉树的根节点
def PreorderTraverse(head):
if head:
print(head.val)
PreorderTraverse(head.leftChild)
PreorderTraverse(head.rightChild)

2. 中序遍历

#head为二叉树的根节点
def InorderTrverse(head):
if head:
InorderTrverse(head.leftChild)
print(head.val)
InorderTrverse(head.rightChild)

3. 后续遍历

#head为二叉树的根节点
def PostorderTraverse(head):
if head:
PostorderTraverse(head.leftChild)
PostorderTraverse(head.rightChild)
print(head.val)

对中序遍历,费了我九牛二虎之力画了一个程序执行的图,红色箭头代表程序执行的过程,依然以a = [1,2,3,4,5,None,6,None,None,7,8]为例

这个图看上去不是很清楚,右键保存到本地看会清楚很多的,我把每一步递归的树都画出来了,这样更加方便理解。

所以程序打印出来的顺序为:4 2 7 5 8 1 3 6


最后,致敬大佬,祝各位学有所成。

【转载表明出处,谢谢】

Python --- 二叉树的层序建立与三种遍历的更多相关文章

  1. python对mysql数据库操作的三种不同方式

    首先要说一下,在这个暑期如果没有什么特殊情况,我打算用python尝试写一个考试系统,希望能在下学期的python课程实际使用,并且尽量在此之前把用到的相关技术都以分篇博客的方式分享出来,有想要交流的 ...

  2. 基于Java的二叉树的三种遍历方式的递归与非递归实现

    二叉树的遍历方式包括前序遍历.中序遍历和后序遍历,其实现方式包括递归实现和非递归实现. 前序遍历:根节点 | 左子树 | 右子树 中序遍历:左子树 | 根节点 | 右子树 后序遍历:左子树 | 右子树 ...

  3. python每次处理一个字符的三种方法

    python每次处理一个字符的三种方法 a_string = "abccdea" print 'the first' for c in a_string: print ord(c) ...

  4. Python 列表(List) 的三种遍历(序号和值)方法

    三种遍历列表里面序号和值的方法: 最近学习python这门语言,感觉到其对自己的工作效率有很大的提升,特在情人节这一天写下了这篇博客,下面废话不多说,直接贴代码 #!/usr/bin/env pyth ...

  5. 【转】python 三种遍历list的方法

    [转]python 三种遍历list的方法 #!/usr/bin/env python # -*- coding: utf-8 -*- if __name__ == '__main__': list ...

  6. 命令行运行Python脚本时传入参数的三种方式

    原文链接:命令行运行Python脚本时传入参数的三种方式(原文的几处错误在此已纠正) 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. pyth ...

  7. PTA 二叉树的三种遍历(先序、中序和后序)

    6-5 二叉树的三种遍历(先序.中序和后序) (6 分)   本题要求实现给定的二叉树的三种遍历. 函数接口定义: void Preorder(BiTree T); void Inorder(BiTr ...

  8. java:数据结构(四)二叉查找树以及树的三种遍历

    @TOC 二叉树模型 二叉树是树的一种应用,一个节点可以有两个孩子:左孩子,右孩子,并且除了根节点以外每个节点都有一个父节点.当然这种简单的二叉树不能解决让树保持平衡状态,例如你一直往树的左边添加元素 ...

  9. javase-常用三种遍历方法

    javase-常用三种遍历方法 import java.util.ArrayList; import java.util.Iterator; import java.util.List; public ...

随机推荐

  1. bzoj1756

    1756: Vijos1083 小白逛公园 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1150  Solved: 371[Submit][Statu ...

  2. SpringMVC数据绑定三(JSON 、XML))

    dhc chrome 地址https://chrome.google.com/webstore/detail/restlet-client-rest-api-t/aejoelaoggembcahagi ...

  3. Python 元组、列表

    Python中,最常用的数据结构就是序列了.序列有以下几种:元组,列表,字符串等.注:代码都是在IDE中编辑的,没有用交互式环境. 一.元组(tuple) 元组其实有点类似C++中的数组,即一旦指定了 ...

  4. 洛谷P4331 [BOI2004]Sequence 数字序列(左偏树)

    传送门 感觉……不是很看得懂题解在说什么? 我们先把原数列$a_i-=i$,那么本来要求递增序列,现在只需要求一个非严格递增的就行了(可以看做最后每个$b_i+=i$,那么非严格递增会变为递增) 如果 ...

  5. net 视图的调用和开发

    1.调用视图 声明实体类 string sql = "select * from View_ExchangeDetails order by CreateTime desc"; v ...

  6. L - Prime Number(求n内质数的个数)

    Description Write a program which reads an integer n and prints the number of prime numbers which ar ...

  7. 题解报告:hdu 2030 汉字统计

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2030 Problem Description 统计给定文本文件中汉字的个数. Input 输入文件首先 ...

  8. Wannafly挑战赛10:A题:小H和迷宫

    题目描述       小H陷入了一个迷宫中,迷宫里有一个可怕的怪兽,血量有N点,小H有三瓶魔法药水,分别可以使怪兽损失a%.b%.c%的血量(之后怪兽的血量会向下取整),小H想合理地运用这三瓶药水,使 ...

  9. AFNetworking2.5使用-转

    来自:http://blog.csdn.net/daiyelang/article/details/38434023 官网下载2.5版本:http://afnetworking.com/ 此文章是基于 ...

  10. webapp开发学习--Ionic+Cordova 环境搭建

    我们看 Ionic 能给我们提供什么? 一个样式库,你可以使用它来装饰你的HTML网页 ,看起来 想 移动程序的界面,什么header .content.footer.grid.list.这貌似没什么 ...