题解 | #按之字形顺序打印二叉树#
解题思路
- 定义一个队列,用于存储每一层的节点;
- 当队列不为空的时候,获取当前队列的元素,之后进行循环操作:
- 取出队列的第一个元素,并将当前元素进行弹出;
- 如果当前层数为偶数,则将节点从头开始插入数组中;
- 如果当前层数为奇数,则将节点从尾开始插入数组中;
- 如果当前节点的左子树不为空,则将其左子树的根节点加入队列;
- 如果当前节点的右子树不为空,则将其右子树的根节点加入队列。
- 完成一层遍历之后,将树的高度加一,并将当前层节点遍历的结果添加到结果数组中;
- 最后返回结果数组。
时间复杂度
-
时间复杂度:
;
-
空间复杂度:
。
代码
#include <queue>
#include <vector>
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> res;
queue<TreeNode*> que;
if(!pRoot)
{
return res;
}
que.push(pRoot);
int height = 1;
while(!que.empty())
{
vector<int> tmp;
int n = que.size();
// 获取每一层的节点
for(int i = 0; i < n; i++)
{
TreeNode* node = que.front();
que.pop();
if(height % 2 == 0)
{
// 如果层数为偶数,就从头开始添加,即逆序
tmp.insert(tmp.begin(), node->val);
}
else
{
// 如果层数为奇数,就顺序添加到尾端
tmp.push_back(node->val);
}
if(node->left)
{
que.push(node->left);
}
if(node->right)
{
que.push(node->right);
}
}
height++;
res.push_back(tmp);
}
return res;
}
};
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param pRoot TreeNode类
# @return int整型二维数组
#
class Solution:
def Print(self , pRoot: TreeNode) -> List[List[int]]:
# write code here
res = []
if pRoot is None:
return res
tree_list = []
tree_list.append(pRoot)
while len(tree_list) > 0:
tmp = []
for i in range(len(tree_list)):
node = tree_list.pop(0)
tmp.append(node.val)
if node.left:
tree_list.append(node.left)
if node.right:
tree_list.append(node.right)
res.append(tmp)
# 前面的代码与树的层次遍历的代码是一模一样的
# 此题关键是下面这个部分:即当偶数行的时候,将值进行反转
for i,v in enumerate(res):
if i%2 != 0:
res[i] = v[::-1]
return res