python BinaryTree

#-------------------------------------------------------------------------------
# Name:        BinaryTree
# Purpose:      普通二叉树,可以构建最大树和最大堆
#
# Author:      M.E.Liu
#
# Created:     08/07/2015
# Copyright:   (c) M.E.Liu 2015
# Licence:     <Artificial Intelligence Lab of HUST>
#-------------------------------------------------------------------------------


def swap(a,b):
    key = a
    a = b
    b = key
    return a,b

class BinaryTreeNode(object):
    __slots__ = ['data', 'left', 'right']

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

    def __getitem__(self, key):
        return self.left if key == 0 else self.right

    def __setitem__(self, key, data):
        if(key==0):
            self.left = data
        elif(key==1):
            self.right = data

class BinaryTree(object):
    __slots__ = ['root', 'count', 'height']

    def __init__(self,root=0,count=0,height=0):
        self.root = root
        self.count = 0  #节点数目
        self.height = 0 #树高度

    def __del__(self):  #销毁函数
        pass

    def findNode(self,treenode,data):#查找节点
        if not treenode:
            return
        if treenode.data==data:
            return treenode
        else:
            treenodeLeft = self.findNode(treenode.left,data)
            treenodeRight = self.findNode(treenode.right,data)
            return treenodeLeft if not treenodeLeft else treenodeRight

    def findParent(self,treenode,data):#查找节点的parent--有待于优化
        if not treenode:
            return
        if self.childCount(treenode)=='twins':
            if treenode.right.data==data or treenode.left.data==data:
                return treenode
            else:
                treenodeLeft = self.findParent(treenode.left,data)
                treenodeRight = self.findParent(treenode.right,data)
                return treenodeLeft if treenodeLeft else treenodeRight
        elif self.childCount(treenode) is 'left' or 'right':
            node = treenode.left if treenode.left else treenode.right
            if node.data==data:
                return treenode
            else:
                return self.findParent(node,data)
        else:
            return

    def findLeaf(self,treenode):#显示叶节点
        if not treenode:
            return
        if self.childCount(treenode)=='none':
            print treenode.data
        else:
            self.findLeaf(treenode.left)
            self.findLeaf(treenode.right)

    def create(self):#人工输入构建BinaryTree
        temp = input('enter a value:')
        if temp is 99:
            return
        treenode = TreeNode(data=temp)
        if not self.root:
            self.root = treenode
        treenode.left = self.create()
        treenode.right = self.create()
        return treenode

    def nodeCount(self,treenode):#计算节点数目
        if treenode:
            self.count += 1
            self.nodeCount(treenode.left)
            self.nodeCount(treenode.right)

    def preOrder(self,treenode):#前序遍历
        if not treenode:
            return
        print treenode.data
        self.preOrder(treenode.left)
        self.preOrder(treenode.right)

    def midOrder(self,treenode):#中序遍历
        if not treenode:
            return
        self.midOrder(treenode.left)
        print treenode.data
        self.midOrder(treenode.right)

    def aftOrder(self,treenode):#后序遍历
        if not treenode:
            return
        self.aftOrder(treenode.left)
        self.aftOrder(treenode.right)
        print treenode.data

    def childCount(self,treenode):#判断节点有无孩子
        if not treenode.left and not treenode.right:
            return 'none'
        elif not treenode.left:
            return 'right'
        elif not treenode.right:
            return 'left'
        else:
            return 'twins'

    def MaxHeap(self,treenode): #调整为最大堆--有待于优化
        if not treenode is 0:
            return
        if self.childCount(treenode)=='none':
            return
        elif self.childCount(treenode)== 'left' or 'right':
            node = treenode.left if treenode.left else treenode.right
            if treenode.data<node.data:
                treenode.data,node.data = swap(treenode.data,node.data)
            self.MaxHeap(node)
        else:
            if treenode.right.data>treenode.left.data and treenode.data<treenode.right.data:
                treenode.data,treenode.right.data = swap(treenode.data,treenode.right.data)
            elif treenode.right.data<treenode.left.data and treenode.data<treenode.left.data:
                treenode.data,treenode.left.data = swap(treenode.data,treenode.left.data)
            self.MaxHeap(treenode.left)
            self.MaxHeap(treenode.right)

    def getHeight(self,treenode):   #获取节点距离叶子高度
        if not treenode:
            return 0
        elif self.childCount(treenode)=='none':
            return 1
        left = self.getHeight(treenode.left)
        right = self.getHeight(treenode.right)
        return left+1 if left>right else right+1

    def BuildMaxTree(self,treenode):#构建最大数
        if not treenode:
            return
        self.BuildMaxTree(treenode.left)
        self.BuildMaxTree(treenode.right)
        self.MaxHeap(treenode)


#Example
def main():
    n10 = BinaryTreeNode(10,0,0)
    n9 = BinaryTreeNode(9,0,0)
    n3 = BinaryTreeNode(3,n9,n10)
    n8 = BinaryTreeNode(8,0,0)
    n14 = BinaryTreeNode(14,0,0)
    n7 = BinaryTreeNode(7,0,0)
    n16 = BinaryTreeNode(16,n7,0)
    n2 = BinaryTreeNode(2,n14,n8)
    n1 = BinaryTreeNode(1,n2,n16)
    root = BinaryTreeNode(4,n1,n3)

    bt = BinaryTree(root)
    print bt.findParent(bt.root,n3.data).data

    pass

if __name__ == '__main__':
    main()


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值