您的位置:首页 > 其它

103. Binary Tree Zigzag Level Order Traversal

2017-05-14 18:09 323 查看
Given a binary tree, return the zigzag level order traversal of its nodes’ values. (ie, from left to right, then right to left for the next level and alternate between).

For example:

Given binary tree [3,9,20,null,null,15,7],

3
/ \
9  20
/  \
15   7


return its zigzag level order traversal as:

[
[3],
[20,9],
[15,7]
]


代码实现

public class Solution {
private int lineno; //从二层开始按行号编号

public IList<IList<int>> ZigzagLevelOrder(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 = zigzagLevelOrder(new List<TreeNode> { root }); //tmp: 第二层~叶子层
if (tmp != null && tmp.Count > 0)
{
foreach (var item in tmp)
rtn.Add(item);
}
return rtn;
}
//第二层到叶子层: right to left; left to right; ...
private IList<IList<int>> zigzagLevelOrder(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;
if(lineno%2==0) //反转本层
{
List<int> tmp = nextn.Select(r => r.val).ToList();
tmp.Reverse();
rtn.Add(tmp);
}
else
rtn.Add(nextn.Select(r=>r.val).ToList()); //正序

++lineno;
var children = zigzagLevelOrder(nextn);
if (children != null && children.Count > 0)
{
foreach (var item in children)
rtn.Add(item);
}
return rtn;
}
}


结果分析



leetcode-solution库

leetcode算法题目解决方案每天更新在github库中,欢迎感兴趣的朋友加入进来,也欢迎star,或pull request。https://github.com/jackzhenguo/leetcode-csharp
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: