python二叉树的深度优先遍历和广度优先遍历

二叉树的实现

# 设计实现二叉树,首先需要一个节点类和树类
# 并且需要对节点类和树类实例化,树需要一个add方法把新的节点加进去
class Node(object):
    def __init__(self, number):
        self.number = number
        self.rchild = None
        self.lchild = None


class Tree(object):
    list = []

    def __init__(self):
        self.root = None

    def add(self, number):
        node = Node(number)
        # 首先判断树是否为空
        if not self.root:
            self.root = node
            Tree.list.append(self.root)
        else:
            # 使用list模拟队列,root和左右子节点依次入队列

            while True:
                point = Tree.list[0]

                if not point.lchild:
                    point.lchild = node
                    Tree.list.append(point.lchild)
                    return
                elif not point.rchild:
                    point.rchild = node
                    Tree.list.append(point.rchild)
                    Tree.list.pop(0)
                    return

    # add基本逻辑就是利用队列依次保存未满状态的节点,然后通过不断取队头point来添加左右
    # 孩子,并把左右孩子加入队列,插入完后检查是否左右孩子都有了,依然未满,则保留,
    # 满了,则退出队列list.pop(0),取下一个队首。

if __name__ == '__main__':
    t = Tree()
    L = [1, 2, 3, 4, 5, 6, 7]
    for x in L:
        t.add(x)
        print('success')

二叉树插入节点的基本思路是:
首先判断根结点是否存在,如果不存在则插入根节点。然后判断左节点是否存在,如果不存在则插入左节点。然后判断右节点是否存在,如果不存在则插入右节点。接着,依次判断左右节点的子节点,直到插入成功。
体现了广度优先的思想,层层遍历。

深度优先遍历:递归实现
广度优先遍历:栈或者队列

深度优先考察递归,当子节点为空时,递归结束。
广度优先考察队列的结构,消除父节点,父节点出队列顺便打印,子节点入队列,当队列内元素为0时,遍历结束。

深度优先
深度优先遍历包括前序遍历,中序遍历,后序遍历。采用递归的方法。

# 深度优先遍历,用递归的方法
def shendu(root):
    if not root:
        return []

    result = []    
    while root:
    	result.append(root)
        if root.left is not None:
            shendu(root.left)
        if root.right is not None:
            shendu(root.right)
    return result

广度优先

# 广度优先遍历,用队列实现
def guangdu(root):
    if not root:
        return []

    result = []
    my_queue = []  
    my_queue.append(root)  
    while my_queue:    	
        node = my_queue.pop(0)
        result.append(node.val)
        if node.left:
            my_queue.append(node.left)
        if node.right:
            my_queue.append(node.right)
            
     return result

用两个队列,一个存放节点,一个存放值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值