题解 | #按之字形顺序打印二叉树#

解题思路

  1. 定义一个队列,用于存储每一层的节点;
  2. 当队列不为空的时候,获取当前队列的元素,之后进行循环操作:
  • 取出队列的第一个元素,并将当前元素进行弹出;
  • 如果当前层数为偶数,则将节点从头开始插入数组中;
  • 如果当前层数为奇数,则将节点从尾开始插入数组中;
  • 如果当前节点的左子树不为空,则将其左子树的根节点加入队列;
  • 如果当前节点的右子树不为空,则将其右子树的根节点加入队列。
  1. 完成一层遍历之后,将树的高度加一,并将当前层节点遍历的结果添加到结果数组中;
  2. 最后返回结果数组。

时间复杂度

  • 时间复杂度:

  • 空间复杂度:

代码

#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
全部评论

相关推荐

10-11 14:44
济南大学 Java
点赞 评论 收藏
分享
09-01 09:00
已编辑
四川旅游学院 运营
牛客55195891...:主要是专业不好,别的没毛病
牛客解忧铺
点赞 评论 收藏
分享
10-01 09:50
门头沟学院 Java
肖先生~:这个人真的很好,点赞
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务