Python实现二叉树

二叉树是由n(n≥0)个结点组成的有限集合、每个结点最多有两个子树的有序树。它或者是空集,或者是由一个根和称为左、右子树的两个不相交的二叉树组成。

特点:

  • 二叉树是有序树,即使只有一个子树,也必须区分左、右子树; 
  • 二叉树的每个结点的度不能大于2,只能取0、1、2三者之一;
  • 叉树中所有结点的形态有5种:空结点、无左右子树的结点、只有左子树的结点、只有右子树的结点和具有左右子树的结点。

#定义单个节点
class Node:
    def __init__(self,data,lchild=None,rchild=None):
        self.data = data
        self.lchild = lchild
        self.rchild = rchild

#定义一个二叉树
class BinTree(object):
    def __init__(self):
        self.root = None#初始化的时候为none

    def add(self, data):
        node = Node(data)
        if self.root is None:#如果根节点为空的话则把这个节点赋给root节点
            self.root = node
        else:
            q = [self.root] #root 节点为非空的时候则把节点放入列表中
            while True:#
                pop_node = q.pop(0)
                if pop_node.lchild is None:
                    pop_node.lchild = node
                    return
                elif pop_node.rchild is None:
                    pop_node.rchild = node
                    return
                else:
                    q.append(pop_node.lchild)
                    q.append(pop_node.rchild)
#----------先出根节点,然后根节点左右节点依次类推
    def traverse(self):  # 层次遍历
        if self.root is None:#如果根节点为空,则返回节点为空
            return None
        q = [self.root]#q列表中放入root对象
        res = [self.root.data]#res中放入数据
        while q != []:#当q列表不为空的时候
            pop_node = q.pop(0)
            if pop_node.lchild is not None:
                q.append(pop_node.lchild)
                res.append(pop_node.lchild.data)

            if pop_node.rchild is not None:
                q.append(pop_node.rchild)
                res.append(pop_node.rchild.data)
        return res

    #------先序遍历-------
    #先根节点,遍历所有树的左子树,在遍历所有数的右子树
    def preorder(self,root):  # 先序遍历
        if root is None:
            return []
        result = [root.data]
        #通过递归调用。。。。。
        left_item = self.preorder(root.lchild)
        right_item = self.preorder(root.rchild)
        #合并列表过程
        return result + left_item + right_item
    #先访问左子树,根节点 ,右子树
    def inorder(self,root):  # 中序序遍历
        if root is None:
            return []
        result = [root.data]
        #-------递归调用---------
        left_item = self.inorder(root.lchild)
        right_item = self.inorder(root.rchild)
        return left_item + result + right_item
    #先左子树,后右子树,根节点
    def postorder(self,root):  # 后序遍历
        if root is None:
            return []
        result = [root.data]
        #-------递归调用---------
        left_item = self.postorder(root.lchild)
        right_item = self.postorder(root.rchild)
        return left_item + right_item + result
    #二叉树的深度
    def Depth(self,root):
        if root is None:
            return 0
        else:
            m=self.Depth(root.lchild)
            n=self.Depth(root.rchild)
        if m>n:
            return m+1
        else:
            return n+1

    #计算二叉树的节点
    def CountNode(self,root):
        if root is None:
            return 0
        else:
            return self.CountNode(root.lchild)+self.CountNode(root.rchild)+1

t = BinTree()
for i in range(10):
    t.add(i)
print('层序遍历:',t.traverse())
print('先序遍历:',t.preorder(t.root))
print('中序遍历:',t.inorder(t.root))
print('后序遍历:',t.postorder(t.root))
print('树深',t.Depth(t.root))
print('节点数',t.CountNode(t.root))

以上是二叉树的一些操作的代码。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值