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


Posted in Python onApril 29, 2014

一、获取二叉树的深度

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

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 相关文章推荐
Python文件右键找不到IDLE打开项解决办法
Jun 08 Python
简介Django框架中可使用的各类缓存
Jul 23 Python
python3读取MySQL-Front的MYSQL密码
May 03 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
Python进程间通信之共享内存详解
Oct 30 Python
VSCode下好用的Python插件及配置
Apr 06 Python
python 在屏幕上逐字显示一行字的实例
Dec 24 Python
Python实现平行坐标图的绘制(plotly)方式
Nov 22 Python
Python + Requests + Unittest接口自动化测试实例分析
Dec 12 Python
Python标准库json模块和pickle模块使用详解
Mar 10 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
python爬虫破解字体加密案例详解
Mar 02 Python
python数据结构之二叉树的遍历实例
Apr 29 #Python
python数据结构之二叉树的建立实例
Apr 29 #Python
python数据结构树和二叉树简介
Apr 29 #Python
Python的ORM框架SQLAlchemy入门教程
Apr 28 #Python
Python中实现远程调用(RPC、RMI)简单例子
Apr 28 #Python
Python的ORM框架SQLObject入门实例
Apr 28 #Python
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 #Python
You might like
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
php 数组元素快速去重
2017/05/05 PHP
PHP笛卡尔积实现原理及代码实例
2020/12/09 PHP
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
2010/06/19 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
2017/03/01 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
2017/09/10 jQuery
基于vue+canvas的excel-like组件实例详解
2017/11/28 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
python根据出生年份简单计算生肖的方法
2015/03/27 Python
python图像常规操作
2017/11/11 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
如何用Python实现简单的Markdown转换器
2018/07/16 Python
详解Django中类视图使用装饰器的方式
2018/08/12 Python
使用python Fabric动态修改远程机器hosts的方法
2018/10/26 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
python两个_多个字典合并相加的实例代码
2019/12/26 Python
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
北美三大旅游网站之一:Travelocity加拿大
2016/08/20 全球购物
香港连卡佛百货官网:Lane Crawford
2019/09/04 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
高中生家长会演讲稿
2014/01/14 职场文书
小学一年级学生评语
2014/04/22 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS
MySQL 8.0 驱动与阿里druid版本兼容问题解决
2021/07/01 MySQL