32-02 分行从上到下打印二叉树
题目
从上到下按层打印二叉树,同一层结点从左至右输出,每一层输出一行。
如下图:
打印效果:
C++ 题解
增加两个变量:
toBePrint
保存这一层还没有打印出来的节点数目;
nextLevel
保存下一层的节点数目,每次打印队列前端节点,toBePrint--
,每次入一个节点到队列中,nextLevel++
;
当toBePrint==0时,表示一层打印完毕,打印换行符,并切换toBePrint
的值。
void Print(BinaryTreeNode* pRoot)
{
if (pRoot == nullptr)
return;
std::queue<BinaryTreeNode*> nodes;
nodes.push(pRoot);
int nextLevel = 0;
int toBePrinted = 1;
while (!nodes.empty())
{
BinaryTreeNode* pNode = nodes.front();
printf("%d ", pNode->m_nValue);
if (pNode->m_pLeft != nullptr)
{
nodes.push(pNode->m_pLeft);
++nextLevel;
}
if (pNode->m_pRight != nullptr)
{
nodes.push(pNode->m_pRight);
++nextLevel;
}
nodes.pop();
--toBePrinted;
if (toBePrinted == 0)
{
printf("\n");
toBePrinted = nextLevel;
nextLevel = 0;
}
}
}
python 题解
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回二维列表
def Print(self, pRoot):
# write code here
if not pRoot:
return []
res=[]
res_val=[]
res.append(pRoot)
nextLevel=0 #表示下一层节点的数目
toBePrinted=1 #表示当前层还没有打印的节点数
temp=[]
while len(res)>0:
node=res[0]
temp.append(node.val)
if node.left:
res.append(node.left)
nextLevel+=1
if node.right:
res.append(node.right)
nextLevel+=1
del res[0]
toBePrinted-=1
if toBePrinted==0:
res_val.append(temp)
toBePrinted=nextLevel
nextLevel=0
temp=[]
return res_val
注意:
- 使用python解法,返回的是二维列表。