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]
发布了146 篇原创文章 · 获赞 37 · 访问量 7860

猜你喜欢

转载自blog.csdn.net/storyfull/article/details/103706611