二叉树的锯齿形层序遍历
难度:中等
题目描述
给你二叉树的根节点 root
,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
示例1
输入: root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]
示例2
输入: root = [1]
输出:[[1]]
示例3
输入: root = []
输出:[]
题解
和 0102 题类似,不同的是从左到右的时候对List
得操作是Add
,从右到左的时候是Insert
到最前面
想法代码
public class TreeNode
{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val = 0, TreeNode left = null, TreeNode right = null)
{
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution
{
public static void Main(string[] args)
{
TreeNode root = new TreeNode(3)
{
left = new TreeNode(9),
right = new TreeNode(20)
{
left = new TreeNode (15),
right = new TreeNode (7)
}
};
Solution solution = new Solution();
IList<IList<int>> ans = solution.ZigzagLevelOrder(root);
foreach (var a in ans)
{
foreach (var b in a)
{
Console.Write(b + " ");
}
Console.WriteLine();
}
}
public IList<IList<int>> ZigzagLevelOrder(TreeNode root)
{
IList<IList<int>> ans = new List<IList<int>>();
if (root == null)
{
return ans;
}
Queue<TreeNode> queue = new Queue<TreeNode>();
queue.Enqueue(root);
bool isLeftFirst = true;
while (queue.Count > 0)
{
IList<int> tmp = new List<int>();
int count = queue.Count;
for (int i = 0; i < count; i++)
{
TreeNode node = queue.Dequeue();
if (isLeftFirst)
{
tmp.Add(node.val);
}
else
{
tmp.Insert(0, node.val);
}
if (node.left != null)
{
queue.Enqueue(node.left);
}
if (node.right != null)
{
queue.Enqueue(node.right);
}
}
ans.Add(tmp);
isLeftFirst = !isLeftFirst;
}
return ans;
}
}