题目描述
- 输入一棵二叉树,求出树的左视图,或者右视图,如下图所示,的两种情况
思路与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:
res.append(item[-1])
print(res)
if __name__ == '__main__':
t = BinaryTree()
for i in range(10):
t.add(i)
t.left_view(t.root)