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,#,#,15,7},

    3
/ \
9 20
/ \
15 7

return its zigzag level order traversal as:

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

思路:由于需要排成之字形,所以用一个栈来存储当前行的内容,另一个栈来存储下一行的内容。

以根为第0层,那么偶数层都应该从左向右输出。那么每次遇到偶数层,压入下一层奇数层时就按从左到右的顺序,这样弹栈时就是从右到左。

纠结了一会儿,AC了。

class Solution {
public:
vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
vector<vector<int>> ans;
if(root == NULL)
{
return ans;
}
int level = ; //记录当前层号
vector<TreeNode *> curlevel;
curlevel.push_back(root);
while(!curlevel.empty())
{
vector<int> partans;
vector<TreeNode *> nextlevel;
if(level % == ) //偶数层,根是第0层
{
while(!curlevel.empty()) //本层不为空
{
if(curlevel.back()->left != NULL) //先压入左边,再压入右边
{
nextlevel.push_back(curlevel.back()->left);
}
if(curlevel.back()->right != NULL)
{
nextlevel.push_back(curlevel.back()->right);
}
partans.push_back(curlevel.back()->val);
curlevel.pop_back();
}
ans.push_back(partans);
curlevel = nextlevel;
}
else
{
while(!curlevel.empty()) //本层不为空
{
if(curlevel.back()->right != NULL) //先压入右边,再压入左边
{
nextlevel.push_back(curlevel.back()->right);
}
if(curlevel.back()->left != NULL)
{
nextlevel.push_back(curlevel.back()->left);
}
partans.push_back(curlevel.back()->val);
curlevel.pop_back();
}
ans.push_back(partans);
curlevel = nextlevel;
}
level++;
}
return ans;
} void createTree(TreeNode * &root)
{
int n;
cin >> n;
if(n != )
{
root = new TreeNode(n);
createTree(root->left);
createTree(root->right);
}
}
};

看看别人的答案。思路不一样。

class Solution {
vector<vector<int> > result;
public:
vector<vector<int> > zigzagLevelOrder(TreeNode *root) { if(root!=NULL)
{
traverse(root, );
} for(int i=;i<result.size();i+=)
{
vector<int>* v = &result[i];
std:reverse(v->begin(), v->end());
}
return result;
} void traverse(TreeNode* node, int level)
{
if(node == NULL) return; vector<int>* row = getRow(level);
row->push_back(node->val); traverse(node->left, level+);
traverse(node->right, level+);
} vector<int>* getRow(int level)
{
if(result.size()<=level)
{
vector<int> newRow;
result.push_back(newRow);
}
return &result[level];
}
};

【leetcode】Binary Tree Zigzag Level Order Traversal (middle)的更多相关文章

  1. 【LeetCode】 Binary Tree Zigzag Level Order Traversal 解题报告

    Binary Tree Zigzag Level Order Traversal [LeetCode] https://leetcode.com/problems/binary-tree-zigzag ...

  2. 【leetcode】Binary Tree Zigzag Level Order Traversal

    Binary Tree Zigzag Level Order Traversal Given a binary tree, return the zigzag level order traversa ...

  3. 【Leetcode】【Medium】Binary Tree Zigzag Level Order Traversal

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  4. 【树】Binary Tree Zigzag Level Order Traversal

    题目: Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from lef ...

  5. leetCode 103.Binary Tree Zigzag Level Order Traversal (二叉树Z字形水平序) 解题思路和方法

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  6. [LeetCode] 103. Binary Tree Zigzag Level Order Traversal 二叉树的之字形层序遍历

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  7. leetcode 103 Binary Tree Zigzag Level Order Traversal ----- java

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  8. [leetcode]103. Binary Tree Zigzag Level Order Traversal二叉树来回遍历

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  9. [LeetCode] 103. Binary Tree Zigzag Level Order Traversal _ Medium tag: BFS

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

随机推荐

  1. MEAN组合框架搭建教程

    1,我们先走在官方github里面下载个包文件: git clone https://github.com/linnovate/mean.git  (是慢了点) 2,我把这个文件解压后文件名叫mean ...

  2. Java-开启Java之路

    .NET还是我的最爱··· 准备学习下底层知识,为Java打打基础, 然后开始正式学习Java, 也算是曲线救国了, Go,Go,Go ... 二〇一六年十一月十日 18:09:54

  3. Request 传值 遇到的中文乱码问题

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="xxxx.aspx.cs&quo ...

  4. Ajax的使用

    Ajax是JQuery实现XMLHttpRequest的一种方式. 增加HTML5按钮,含有点击事件: <button type="button" class="b ...

  5. codeblocks+Mingw 下配置开源c++单元测试工具 google test

    google test 是google的c++开源单元测试工具,chrome的开发团队就是使用它. Code::Blocks 12.11(MinGW 4.7.1) (Windows版)Google T ...

  6. Java之enumeration(枚举)

    enumeration(枚举)是JDK1.5引入的新特性,放在java.lang包中. 1.枚举类方法介绍 package com.enums; public class TestEnum { pub ...

  7. Android--UI之AutoCompleteTextView

    前言 之前讲过EditText,有兴趣的朋友可以看一下.这篇博客主要说明的是自动完成文本框,它实际上也是一个文本编辑框,可以理解为对EditText功能的扩展,它对输入的内容可以进行提示并且自动完成. ...

  8. hiberante学习笔记

    1.配置文件(hibernate映射文件): 让hibernate知道该怎么样去load,store持久化对象: 1.1 数据库忌讳的字段名 1) User 2) index 2.数据库表中一对多,多 ...

  9. Sqli-LABS通关笔录-6

    第六关跟第五关一样的是布尔型盲注技术. 只是在部分有出路 添加一个单引号.程序无反应.双引号和斜杠可使其报错. 这一关让我学到了 1.管他三七二十七报错看看语句再说. THE END

  10. 剑指Offer 二叉树中和为某一值的路径(dfs)

    题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.     思路: 递归,然后深搜,因为题目定义的, ...