原题
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]
]
题目分析
二叉树层序遍历,转化为数组。先求从根到叶子的层序遍历,然后逆序。
代码实现
先求从根到叶子的层序遍历
/// <summary>
/// 107. Binary Tree Level Order Traversal II
/// </summary>
public IList<IList<int>> LevelOrderUp(TreeNode root)
{
if (root == null)
return new List<IList<int>>();
IList<IList<int>> rtn = new List<IList<int>>{new List<int> {root.val}};
var tmp = getNextLevel(new List<TreeNode> { root });
if (tmp != null && tmp.Count > 0)
{
foreach (var item in tmp)
rtn.Add(item);
}
return rtn;
}
private IList<IList<int>> getNextLevel(IList<TreeNode> curLevel)
{
if (curLevel == null || curLevel.Count == 0)
return null;
IList<IList<int>> rtn= new List<IList<int>>();
List<TreeNode> nextn = new List<TreeNode>();
foreach (var item in curLevel)
{
if (item.left != null)
nextn.Add(item.left);
if (item.right != null)
nextn.Add(item.right);
}
if (nextn.Count == 0)
return null;
rtn.Add(nextn.Select(r => r.val).ToList());
var children = getNextLevel(nextn);
if (children != null && children.Count > 0)
{
foreach (var item in children)
rtn.Add(item);
}
return rtn;
}
逆序:
public IList<IList<int>> LevelOrderBottom(TreeNode root)
{
var rtn = LevelOrderUp(root);
if (rtn != null && rtn.Count > 0)
{
List<IList<int>> rtn2 = new List<IList<int>>();
rtn2.AddRange(rtn);
rtn2.Reverse(); //Ilist.Reverse() failure!
return rtn2;
}
return new List<IList<int>>();
}