python数据结构之二叉树的统计与转换实例

这篇文章主要介绍了python数据结构之二叉树的统计与转换实例,例如统计二叉树的叶子、分支节点,以及二叉树的左右两树互换等,需要的朋友可以参考下

一、获取二叉树的深度



就是二叉树最后的层次,如下图:



实现代码:

代码如下:



def getheight(self):

       
''' 获取二叉树深度 '''

       
return self.__get_tree_height(self.root)



    def
__get_tree_height(self, root):

       
if root is 0:

           
return 0

       
if root.left is 0 and root.right is 0:

           
return 1

       
else:

           
left = self.__get_tree_height(root.left)

           
right = self.__get_tree_height(root.right)

           
if left < right:

               
return right 1

           
else:

               
return left 1



二、叶子的统计



叶子就是二叉树的节点的 left 指针和 right 指针分别指向空的节点

复制代码 代码如下:



def getleafcount(self):

       
''' 获取二叉树叶子数 '''

       
return self.__count_leaf_node(self.root)



    def
__count_leaf_node(self, root):

       
res = 0

       
if root is 0:

           
return res

       
if root.left is 0 and root.right is 0:

           
res = 1

           
return res

       
if root.left is not 0:

           
res = self.__count_leaf_node(root.left)

       
if root.right is not 0:

           
res = self.__count_leaf_node(root.right)

       
return res



三、统计叶子的分支节点



与叶子节点相对的其他节点 left 和 right 的指针指向其他节点



复制代码 代码如下:



def getbranchcount(self):

       
''' 获取二叉树分支节点数 '''

       
return self.__get_branch_node(self.root)



    def
__get_branch_node(self, root):

       
if root is 0:

           
return 0

       
if root.left is 0 and root.right is 0:

           
return 0

       
else:

           
return 1 self.__get_branch_node(root.left)
self.__get_branch_node(root.right)



四、二叉树左右树互换



代码如下:



def replacelem(self):

       
''' 二叉树所有结点的左右子树相互交换 '''

       
self.__replace_element(self.root)



    def
__replace_element(self, root):

       
if root is 0:

           
return

       
root.left, root.right = root.right, root.left

       
self.__replace_element(root.left)

       
self.__replace_element(root.right)

这些方法和操作,都是运用递归。其实二叉树的定义也是一种递归。附上最后的完整代码:

代码如下:



# -*- coding: utf - 8 - *-



    

class TreeNode(object):



    def
__init__(self, left=0, right=0, data=0):

       
self.left = left

       
self.right = right

       
self.data = data



    

class BinaryTree(object):



    def
__init__(self, root=0):

       
self.root = root



    def
is_empty(self):

       
if self.root is 0:

           
return True

       
else:

           
return False



    def
create(self):

       
temp = input('enter a value:')

       
if temp is '#':

           
return 0

       
treenode = TreeNode(data=temp)

       
if self.root is 0:

           
self.root = treenode



       
treenode.left = self.create()

       
treenode.right = self.create()



    def
preorder(self, treenode):

       
'前序(pre-order,NLR)遍历'

       
if treenode is 0:

           
return

       
print treenode.data

       
self.preorder(treenode.left)

       
self.preorder(treenode.right)



    def
inorder(self, treenode):

       
'中序(in-order,LNR'

       
if treenode is 0:

           
return

       
self.inorder(treenode.left)

       
print treenode.data

       
self.inorder(treenode.right)



    def
postorder(self, treenode):

       
'后序(post-order,LRN)遍历'

       
if treenode is 0:

           
return

       
self.postorder(treenode.left)

       
self.postorder(treenode.right)

       
print treenode.data



    def
preorders(self, treenode):

       
'前序(pre-order,NLR)非递归遍历'

       
stack = []

       
while treenode or stack:

           
if treenode is not 0:

               
print treenode.data

               
stack.append(treenode)

               
treenode = treenode.left

           
else:

               
treenode = stack.pop()

               
treenode = treenode.right



    def
inorders(self, treenode):

       
'中序(in-order,LNR) 非递归遍历'

       
stack = []

       
while treenode or stack:

           
if treenode:

               
stack.append(treenode)

               
treenode = treenode.left

           
else:

               
treenode = stack.pop()

               
print treenode.data

               
treenode = treenode.right



    def
postorders(self, treenode):

       
'后序(post-order,LRN)非递归遍历'

       
stack = []

       
pre = 0

       
while treenode or stack:

           
if treenode:

               
stack.append(treenode)

               
treenode = treenode.left

           
elif stack[-1].right != pre:

               
treenode = stack[-1].right

               
pre = 0

           
else:

               
pre = stack.pop()

               
print pre.data



    # def
postorders(self, treenode):

   
#    
'后序(post-order,LRN)非递归遍历'

   
#    
stack = []

   
#    
queue = []

   
#    
queue.append(treenode)

   
#    
while queue:

   
#        
treenode = queue.pop()

   
#        
if treenode.left:

   
#            
queue.append(treenode.left)

   
#        
if treenode.right:

   
#            
queue.append(treenode.right)

   
#        
stack.append(treenode)

   
#    
while stack:

   
#        
print stack.pop().data



    def
levelorders(self, treenode):

       
'层序(post-order,LRN)非递归遍历'

       
from collections import deque

       
if not treenode:

           
return

       
q = deque([treenode])

       
while q:

           
treenode = q.popleft()

           
print treenode.data

           
if treenode.left:

               
q.append(treenode.left)

           
if treenode.right:

               
q.append(treenode.right)



    def
getheight(self):

       
''' 获取二叉树深度 '''

       
return self.__get_tree_height(self.root)



    def
__get_tree_height(self, root):

       
if root is 0:

           
return 0

       
if root.left is 0 and root.right is 0:

           
return 1

       
else:

           
left = self.__get_tree_height(root.left)

           
right = self.__get_tree_height(root.right)

           
if left < right:

               
return right 1

           
else:

               
return left 1



    def
getleafcount(self):

       
''' 获取二叉树叶子数 '''

       
return self.__count_leaf_node(self.root)



    def
__count_leaf_node(self, root):

       
res = 0

       
if root is 0:

           
return res

       
if root.left is 0 and root.right is 0:

           
res = 1

           
return res

       
if root.left is not 0:

           
res = self.__count_leaf_node(root.left)

       
if root.right is not 0:

           
res = self.__count_leaf_node(root.right)

       
return res



    def
getbranchcount(self):

       
''' 获取二叉树分支节点数 '''

       
return self.__get_branch_node(self.root)



    def
__get_branch_node(self, root):

       
if root is 0:

           
return 0

       
if root.left is 0 and root.right is 0:

           
return 0

       
else:

           
return 1 self.__get_branch_node(root.left)
self.__get_branch_node(root.right)



    def
replacelem(self):

       
''' 二叉树所有结点的左右子树相互交换 '''

       
self.__replace_element(self.root)



    def
__replace_element(self, root):

       
if root is 0:

           
return

       
root.left, root.right = root.right, root.left

       
self.__replace_element(root.left)

       
self.__replace_element(root.right)



node1 = TreeNode(data=1)

node2 = TreeNode(node1, 0, 2)

node3 = TreeNode(data=3)

node4 = TreeNode(data=4)

node5 = TreeNode(node3, node4, 5)

node6 = TreeNode(node2, node5, 6)

node7 = TreeNode(node6, 0, 7)

node8 = TreeNode(data=8)

root = TreeNode(node7, node8, 'root')



    

bt = BinaryTree(root)



print u'''



生成的二叉树



------------------------

        
root

     
7       
8

    6

  2   5

1    3 4



-------------------------



'''

python数据结构之二叉树的统计与转换实例的更多相关文章

  1. python数据结构之二叉树的实现

    树的定义 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...

  2. Python数据结构之二叉树

    本来打算一个学期分别用C++.Python.Java实现数据结构,看来要提前了 这个是Python版本,我写的数据结构尽量保持灵活性,本文bt1是一般的插入法建立二叉树结构,bt2就是可以任意输入,至 ...

  3. python数据结构之二叉树遍历的实现

    本篇是实现二叉树的三种遍历,先序遍历,中序遍历,后序遍历 #!/usr/bin/python # -*- coding: utf-8 -*- class TreeNode(object): def _ ...

  4. python 数据结构之二叉树

    二叉树关键在构建和遍历,python实现相对简单,我们在实现需要用到类,分别设置爱左右子树,根节点,然后从根进行遍历,进行判断,若为空进行树的构建,非空则返回到列表中即可,我在进行遍历时产生了一个错误 ...

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

    遍历方案   从二叉树的递归定义可知,一棵非空的二叉树由根结点及左.右子树这三个基本部分组成.因此,在任一给定结点上,可以按某种次序执行三个操作:   1).访问结点本身(N)   2).遍历该结点的 ...

  6. python数据结构之二叉树的建立实例

    先建立二叉树节点,有一个data数据域,left,right 两个指针域 # coding:utf-8 class TreeNode(object): def __init__(self,left=N ...

  7. python数据结构树和二叉树简介

    一.树的定义 树形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树.树的递归定义:树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树,否 ...

  8. Python实现打印二叉树某一层的所有节点

    不多说,直接贴程序,如下所示 # -*- coding: utf-8 -*- # 定义二叉树节点类 class TreeNode(object): def __init__(self,data=0,l ...

  9. python数据结构之图的实现方法

    python数据结构之图的实现方法 本文实例讲述了python数据结构之图的实现方法.分享给大家供大家参考.具体如下: 下面简要的介绍下: 比如有这么一张图:     A -> B     A ...

随机推荐

  1. iOS导航栏的背景颜色设置

    方法一: (1) self.navigationController.navigationBar.barStyle = UIBarStyleDefault; self.navigationContro ...

  2. 线段树求后继+环——cf1237D

    /* 首先开三倍消环(两倍是不够的),倒序求值,线段树找一下后继即可 */ #include<bits/stdc++.h> using namespace std; #define N 3 ...

  3. [bzoj2839]集合计数 题解 (组合数+容斥)

    Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模1000000007 ...

  4. (转)openfire插件开发(一)

    转:http://blog.csdn.net/lovexieyuan520/article/details/37774909 1. 在上一篇博文中,我介绍了Openfire3.9.3源代码导入ecli ...

  5. maven学习整理-基础知识

    1.maven认识 maven是一种自动化的构建工具,它主要解决的问题有: ①项目中的划分规则:原先我们用package或文件夹的形式来划分不同模块,导致在一个项目中存在大量的文件夹和包代码显得庞大: ...

  6. 7. Python运算符之逻辑、成员、身份运算符及优先级

    运算符 逻辑表达式 描述 and x and y 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值. or x or y 布尔& ...

  7. 1. Python版本的选择与安装

    Python综述 Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,它具有卓越的通 ...

  8. zabbix4.0自动注册实践

    共分为两个步骤: 1.主机zabbix_agent客户端的配置文件 2.主机zabbix_server网页端的自动注册配置 zabbix_agent配置文件 Server=192.168.100.15 ...

  9. 【POJ】2031 Building a Space Station

    题目链接:http://poj.org/problem?id=2031 题意:修建太空站每个舱之间的走廊.每个舱都是球体.给出n个舱的三维空间坐标以及球体半径.如果球体之间接触或者相接,就不用修走廊. ...

  10. usb-host与外设之间的通信(一)

    迫于需要开始一个app实现安卓手机控制外设,要学习一下usb-host这方面的知识,所以记录一下自己的学习经历.关于usb-host这一块的资料国内还是比较少的,我只能学到哪里就记录到哪里了. 简单来 ...