python 数据结构 实现二叉树

python实现二叉树

class Node:
    def __init__(self,item):
        '''二叉树的节点'''
        self.item = item
        self.lchild = None
        self.rchild = None

class Tree:
    '''二叉树'''
    def __init__(self,root= None):
        self.root = root

    def add(self,item):
        '''添加节点'''
        node = Node(item) # 生成节点
        if self.root == None:
            self.root = node
        else:
            queue = [] # 创建队列 存放要判断的节点
            queue.append(self.root)
            while queue:
                cur = queue.pop(0)
                # 弹出列表第一个结点
                if cur.lchild is None:
                    # 判断结点左孩子是否为空
                    cur.lchild = node
                    return
                elif cur.rchild is None:
                    # 判断结点左孩子是否为空
                    cur.rchild = node
                    return
                else:
                    # 若果结点的左右都有结点,则将在左右子节点放入判断的列表中
                    queue.append(cur.lchild)
                    queue.append(cur.rchild)

    def breadth_travel(self):
        '''层次遍历,广度优先遍历'''
        if self.root == None:
            return
        queue = [self.root] # 将根节点放入队列
        while queue:
            cur = queue.pop(0) # 从列表中拿出第一个元素
            print(cur.item)
            if cur.lchild:
                queue.append(cur.lchild)
            if cur.rchild:
                queue.append(cur.rchild)

    def preorder(self,root):
        '''先序遍历,根左右'''
        if root is None:
            return
        print(root.item)
        self.preorder(root.lchild)
        self.preorder(root.rchild)

    def inorder(self, root):
        '''中序遍历,左根右'''
        if root is None:
            return
        self.inorder(root.lchild)
        print(root.item)
        self.inorder(root.rchild)

    def postorder(self,root):
        '''后序遍历,左右根'''
        if root is None:
            return
        self.postorder(root.lchild)
        self.postorder(root.rchild)
        print(root.item)

广度优先遍历:
按照层次,从上至下,从左至右遍历。
深度优先遍历:

  • 前序遍历:根节点–>左子树–>右子树
  • 中序遍历:左子树–>根节点–>右子树
  • 后序遍历:左子树–>右子树–>根节点

创建一个二叉树,并且使用不同的方式遍历。

if __name__ == '__main__':
    tree = Tree()
    tree.add('a')
    tree.add('b')
    tree.add('c')
    tree.add('d')
    tree.add('e')
    tree.add('f')
    tree.add('g')
    tree.add('h')
    tree.add('i')
    tree.breath_travel()
    print('-------------------------------------')
    tree.preorder(tree.root)
    print('-------------------------------------')
    tree.inorder(tree.root)
    print('-------------------------------------')
    tree.postorder(tree.root)

运行结果如下:

# 广度优先遍历
a
b
c
d
e
f
g
h
i
-------------------------------------
# 前序遍历
a
b
d
h
i
e
c
f
g
-------------------------------------
# 中序遍历
h
d
i
b
e
a
f
c
g
-------------------------------------
# 后序遍历
h
i
d
e
b
f
g
c
a
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值