题目
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]
]
题意
二叉树层次遍历变形题,题目要求遍历从左到右,从下到上,可以转换为普通的层次遍历,最后将使用resever()函数将vector反转。
Python语言
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
import Queue
class Solution(object):
def levelOrderBottom(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
res = []
now = []
q = Queue.Queue(maxsize = 0)
q.put(root)
q.put(None)
while q.empty() == False :
p = q.get()
if p != None:
now.append(p.val)
if p.left != None:
q.put(p.left)
if p.right != None:
q.put(p.right)
else:
if len(now)!=0:
q.put(None)
res.append(now)
now = []
res.reverse()
return res
C++语言
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
//存放结果
vector<vector<int>>res;
vector<int>now;
res.clear();
now.clear();
//先进先出
queue<TreeNode*>q;
q.push(root);
//进入空隔开
q.push(NULL);
while(!q.empty())
{
TreeNode* p = q.front();
q.pop();
if(p!=NULL)
{
now.push_back(p->val);
if(p->left!=NULL)
q.push(p->left);
if(p->right!=NULL)
q.push(p->right);
}
else
{
if(!now.empty())
{
q.push(NULL);
res.push_back(now);
now.clear();
}
}
}
reverse(res.begin(),res.end());
return res;
}
};
python队列操作
Python中,队列是线程间最常用的交换数据的形式。Queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。
创建一个“队列”对象
import Queue q = Queue.Queue(maxsize = 10) //Queue.Queue类即是一个队列的同步实现。 可通过Queue的构造函数的可选参数maxsize来设定队列长度。 如果maxsize小于1就表示队列长度无限。
将一个值放入队列中
q.put(10) put()有两个参数,第一个item为必需的,为插入项目的值; 第二个block为可选参数,默认为1.如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
将一个值从队列中取出
q.get() 可选参数为block,默认为True。 get()就使调用线程暂停,直至有项目可用。 如果队列为空且block为False,队列将引发Empty异常。
Python Queue模块有三种队列及构造函数:
- 1、Python Queue模块的FIFO队列先进先出。 class Queue.Queue(maxsize)
- 2、LIFO类似于堆,即先进后出。 class Queue.LifoQueue(maxsize)
- 3、还有一种是优先级队列级别越低越先出来。 class Queue.PriorityQueue(maxsize)
此包中的常用方法(q = Queue.Queue()):
- q.qsize() 返回队列的大小
- q.empty() 如果队列为空,返回True,反之False
- q.full() 如果队列满了,返回True,反之False
- q.full 与 maxsize 大小对应
- q.get([block[, timeout]]) 获取队列,timeout等待时间
- q.get_nowait() 相当q.get(False)
- 非阻塞 q.put(item) 写入队列,timeout等待时间
- q.put_nowait(item) 相当q.put(item, False)
- q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
- q.join() 实际上意味着等到队列为空,再执行别的操作
python list reverse() 列表反转
res = [1,2,3]
res.reverse()
print res
//[3,2,1]