上到下打印出二叉树
上到下打印出二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
思路
说白了就是层次遍历
借助队列 先进先出 的特点,遍历二叉树,一个个入队
- collection.deque 双端队列,当经常从两端添加删除元素时,比较方便,可从两边append或appendleft,这是list不具有的
- deque文档描述
import collections
q = collection.deque()
q.append('a') #最右边添加一个元素
q.appendleft('b') #最左边添加一个元素
q.extend(['c','d']) #最右边添加所有元素
q.extendleft(['e','f']) #最左边添加所有元素
q.pop() #取出最右边的元素
q.popleft() #取出最左边的元素
q.remove('c') #从队列中将'c'删除
q.reverse() #倒序
#利用双端队列实现
def levelOrder(self, root):
res = []
q = collections.deque()
if root:#若root不为空,添加root节点
q.append(root)
while q:
node = q.popleft()
res.append(node.val)
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
return res
#利用list实现
def levelOrder(self, root):
res = []
queue = []
if root:
queue.append(root)
else:
return res
while queue:
node = queue.pop(0)
res.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return res
//利用STL的queue队列实现
vector<int> levelOrder(TreeNode* root) {
queue<TreeNode*> q;
vector<int> res;
if(root)
q.push(root);
while(!q.empty())
{
TreeNode* node = q.front();
q.pop();
res.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
return res;
}