python实现二叉树

python实现二叉树

二叉树的简介

二叉树是有限个数据元素的集合,该元素或者为空,或者由一个称为根的元素及两个不相交的,被分别称为根的左子树和根的右子树的树组成,当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点

如果一颗二叉树每一层的结点个数都达到了最大,这颗二叉树称作满二叉树。区别于完全二叉树完全二叉树相对于满二叉树而言,只是删除了满二叉树最底层最右边的连续若干个节点,这样形成的二叉树称为完全二叉树。

举例

满二叉树
在这里插入图片描述
非满二叉树
在这里插入图片描述
完全二叉树
在这里插入图片描述
非完全二叉树
在这里插入图片描述

实现的方法

遍历二叉树时按照某种顺序访问二叉树的每个节点,使每个节点被访问一次且仅被访问一次。我们把D,L,R分别表示访问根节点,遍历根节点的左子树,遍历根节点的右子树。中序遍历为LDR,先序遍历DLR,后续遍历LRD
这里我们已先序遍历为例子介绍:
先序遍历的递归过程:若二叉树为空,遍历结束,否则按照下面顺序遍历:
(1)访问根节点
(2)先序遍历根节点的左子树
(3)先序遍历根节点的右子树
同理可知后序以及中序的实现过程

层次遍历:

在这里插入图片描述
在上面的图中层次遍历的结果为ABCDEFG

层次遍历的定义

所谓层次遍历是指二叉树的第一个开始从上至下逐层遍历,在同一层,则按从左到右顺序对节点逐个访问。
在实现

实现的代码

class Node(object):
    def __init__(self,item):
        self.item=item
        self.left=None
        self.right=None
class Tree(object):
    def __init__(self):
        self.root=None  #首先定义一个根节点
    def add(self,item):
        node=Node(item)  #i将tem其转化为Node型
        queue=[self.root] #用队列存储根节点
        if self.root is None:
            self.root=node  #如果根节点为空那么就将node赋值给根节点root
            return
        while queue:  #只要队列不为空就执行while语句里面的内容
            cur_node=queue.pop(0) # cur_node用于存储队列弹出的元素
            if cur_node.left is None:
                cur_node.left=node  #判断左子树是否为空,为空则把node赋值给左子树
                return
            else:
                queue.append(cur_node.left) #如果不是空,则把cur_node.的左孩子放入队列当中
            if cur_node.right is None:
                cur_node.right=node#判断左子树是否为空,为空则把node赋值给右子树
                return
            else:
                queue.append(cur_node.right)
    def breadth_travel(self):
        """层次遍历"""
        if self.root is None:
            return
        queue=[self.root]
        while queue:
            cur_node=queue.pop(0)
            print(cur_node.item,end=" ")
            if cur_node.left is not None:
                queue.append(cur_node.left)
            if cur_node.right is not None:
                queue.append(cur_node.right)                
    def preorder(self,root):
        """先序遍历"""
        if root is None:
            return
        print(root.item,end=" ")
        self.preorder(root.left)
        self.preorder(root.right)
    def inorder(self,root):
        """中序遍历"""
        if root is None:
            return
        self.inorder(root.left)
        print(root.item,end=" ")
        self.inorder(root.right)
    def afterorder(self,root):
        """后序遍历"""
        if root is None:
            return
        self.afterorder(root.left)
        self.afterorder(root.right)
        print(root.item,end=" ")
tree=Tree()
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
tree.add(6)
tree.add(7)
tree.add(8)
tree.add(9)
print("层次遍历结果:")
tree.breadth_travel()
print("\n")
print("先序遍历结果:")
tree.preorder(tree.root)
print("\n")
print("中序遍历结果:")
tree.inorder(tree.root)
print("\n")
print("后序遍历结果:")
tree.afterorder(tree.root)


拓展:

一颗二叉树的遍历结果如下:
先序遍历结果:
1 2 4 8 9 5 3 6 7
中序遍历结果:
8 4 9 2 5 1 6 3 7
后序遍历结果:
8 9 4 5 2 6 7 3 1

给定先序和中序遍历结果求后续遍历结果(无二叉树图形)


在这里插入图片描述
在这里插入图片描述

给定后序和中序遍历结果求后续遍历结果(无二叉树图形)

后续遍历与先序遍历类似,只是后续遍历根节点实在右边。笔者不在一一分析。

  • 12
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

William_Tao(攻城狮)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值