考点:按层遍历二叉树
题目描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
- 分析思路:
此题实质考查二叉树的遍历,只是不是常见的前序、中序、后序遍历。
考查的数据结构是队列(先入先出)。从根节点开始,先入队;若该节点有子节点,依次从左到右入队。接下来,打印队头最早进入队列的节点,队头后移,重复刚才的操作。
比如下面二叉树,按层打印顺序为:8,6,10,5,7,9,11
- 实现代码:
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
TreeNode *fr;
if(root==NULL)
return result;
que.push(root); //根节点入队
while(!que.empty())
{
fr=que.front(); //fr表示队头的变量
result.push_back(fr->val); //按层遍历顺序
//根的左节点不为空,入队
if(fr->left!=NULL)
que.push(fr->left);
//根的右节点不为空,入队
if(fr->right!=NULL)
que.push(fr->right);
que.pop();
}
return result;
}
private:
vector<int> result;
queue<TreeNode*> que;
};
注:que.pop();放在result.push_back(fr->val); 之后也可以。
python实现
class Solution:
# 返回从上到下每个节点值列表,例:[1,2,3]
def PrintFromTopToBottom(self, root):
# write code here
res=[]
queue=[]
if root==None:
return res
queue.append(root)
while queue:
fr=queue[0]
queue.pop(0)
res.append(fr.val)
if fr.left:
queue.append(fr.left)
if fr.right:
queue.append(fr.right)
return res
输出按层存储(力扣102)
思路:对que长度加一层循环。
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
que=[]
res=[]
que.append(root)
while len(que)>0:
t=[]
size=len(que)
for _ in range(size):
fr=que.pop(0)
t.append(fr.val)
if fr.left:
que.append(fr.left)
if fr.right:
que.append(fr.right)
res.append(t)
return res