题目:
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).
For example:
Given binary tree [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
return its bottom-up level order traversal as:
[ [15,7], [9,20], [3] ]
题意:
从底向上 层次遍历二叉树,打印从叶节点到根节点的层次遍历的节点值。
代码:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def levelOrderBottom(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if root == None :
return [] #如果根节点为空,则返回空链表
else :
node_value_result = [[root.val]] #node_value_result 记录从叶节点开始层次遍历的各节点的节点值
ancestors = [root] #ancestors记录当前层的父节点,依次遍历,寻找每个当前父节点的孩子节点
while len(ancestors) != 0 : #如果当前父节点为空,退出
temp_node_value = [] #否则,temp_node_value 记录当前所有父节点的孩子节点的值
next_ancestors = [] #next_ancestors 记录当前所有父节点的孩子节点,到下一次循环,这些节点变成父节点
for i in range(len(ancestors)) : #依次 遍历每个父节点
if ancestors[i].left != None : #访问左孩子
temp_node_value.append(ancestors[i].left.val)
next_ancestors.append(ancestors[i].left)
if ancestors[i].right != None : #访问右孩子
temp_node_value.append(ancestors[i].right.val)
next_ancestors.append(ancestors[i].right)
if len(temp_node_value) != 0 : #如果孩子节点值不为空,插入到result中,用于返回
node_value_result.append(temp_node_value)
ancestors = next_ancestors #更新父节点
return node_value_result[::-1] #逆序输出,得到从叶节点开始的层次遍历结果
笔记:
本题运用list结构,用两个list分别存储当前父节点和当前父节点的所有孩子,通过不断更新父节点list,达到层次遍历的目的。另外,用一个list存储每一层的节点值,用于返回。
算法参考:http://www.cnblogs.com/kwangeline/p/5953475.html