Python数据结构与算法题目 打印二叉树的左视图 打印二叉树的右视图 树的左视图 树的右视图

本文介绍了一种算法,用于求解二叉树的左视图和右视图。通过对二叉树进行广度优先搜索,每次记录每层的第一个和最后一个节点,从而得到左视图和右视图。该算法适用于各种形态的二叉树。

题目描述

  • 输入一棵二叉树,求出树的左视图,或者右视图,如下图所示,的两种情况
    在这里插入图片描述

思路与Python实现

  • 如果可以用非递归的方式写出二叉树的深度遍历或者广度遍历的话,如果给定的一棵树是一棵满二叉树或者完全二叉树,那么左视图就是,一直添加左子树的结点,然后输出即可;但是如上左图的二叉树,没有严格按照完全二叉树的定义,那么我们就要改变下想法了!
  • 直接从 广度遍历出发,因为广度遍历是一层一层的打印,所以想法是,每次都输出每一层的第一个结点就是左视图,每一层最后一个结点,就是右视图,而且这种做法,不受二叉树形态的影响
  • 具体做法是:在广度遍历的代码上修改,通过控制二叉树每层的结点,每次获取到每一层二叉树的所有结点,然后遍历出每一层结点,输出第一个或者最后一个即可!
class TreeNode(object):
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None


class BinaryTree(object):
    def __init__(self, root=None):
        self.root = root

    def add(self, val):  # 添加结点
        node = TreeNode(val)
        if self.root is None:
            self.root = node
            return
        queue = [self.root]
        while queue:
            temp_node = queue.pop(0)
            if temp_node.left is None:
                temp_node.left = node
                return
            else:
                queue.append(temp_node.left)
            if temp_node.right is None:
                temp_node.right = node
                return
            else:
                queue.append(temp_node.right)


    def tree_view(self, node):  # 打印出树的左、右视图
        if node is None:
            return
        queue = [node]
        node_list = [] 
        while queue:
            temp = []
            for k in range(len(queue)):  # 控制二叉树每层的结点
                temp_node = queue.pop(0)
                if temp_node.left:
                    queue.append(temp_node.left)
                if temp_node.right:
                    queue.append(temp_node.right)
                temp.append(temp_node.val) # 每次添加到这一层所有结点
            node_list.append(temp) # 将所有层,按照列表的形式存放好
        res = []
        for item in node_list:
            # ans.append(item[0]) # 左视图
            res.append(item[-1]) # 右视图
        print(res)


if __name__ == '__main__':
    t = BinaryTree()
    for i in range(10):
        t.add(i)
    t.left_view(t.root) # [0,1,3,7] / [0,2,6,9]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值