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脚本实现分析dns日志并对受访域名排行
Sep 18 Python
Python 中Pickle库的使用详解
Feb 24 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
pandas如何处理缺失值
Jul 31 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
Aug 27 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
Nov 26 Python
在Python中利用pickle保存变量的实例
Dec 30 Python
tensorboard显示空白的解决
Feb 15 Python
解决Keras 自定义层时遇到版本的问题
Jun 16 Python
python 图像插值 最近邻、双线性、双三次实例
Jul 05 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
Python中使用subprocess库创建附加进程
May 11 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
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
2011/04/27 Javascript
用innerhtml提高页面打开速度的方法
2013/08/02 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
2015/06/10 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
利用vue-router实现二级菜单内容转换
2016/11/30 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
Python通过socketserver处理多个链接
2020/03/18 Python
Python加速程序运行的方法
2020/07/29 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
物理系毕业生自荐信
2013/11/01 职场文书
打架检讨书100字
2014/01/08 职场文书
大学总结自我鉴定
2014/01/18 职场文书
物控部经理职务说明书
2014/02/25 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
三好学生个人总结
2015/02/15 职场文书
暖春观后感
2015/06/08 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
竞聘书的秘诀
2019/04/02 职场文书
导游词之苏州盘门景区
2019/11/12 职场文书
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS