牛客网剑指Offer——从上往下打印二叉树

题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

解题思路

本题需要借助队列来完成,每一次打印一个结点的时候,如果该结点有子节点,把该结点的子节点放到队列的尾。接下来到队列的头部取出最早进入队列的结点,重复前面打印操作,直到队列中所有的结点都被打印出为止。

以如下二叉树为例:

1                  8
2                /  \
3               6   10
4              / \  / \
5             5  7 9  11

解题步骤如下:

  1. 设置一个队列,将根节点加入队列。每次循环开始,首先从队头取出一个节点,将该节点的数据值放入res(最后返回的vector)。同时将该节点的左右子结点加入队列。对应上述二叉树,具体过程如下:
  2. 首先将根节点放入队列。循环开始,从队头取出一个节点(即根节点8),将该节点的值放入res,然后将该节点的左右子结点加入队列,即6和10;
  3. 从队头取出节点6,将6放入res,同时加入节点6的左右节点(5和7)到队列尾,此时队列中节点为10、5、7;
  4. 从队头取出节点10,将10放入res,同时加入节点10的左右节点到队尾,此时队列节点为5、7、9、11;
  5. 此时取出队头节点5,将5放入res,同时加入节点5的左右节点NULL到队尾(由于加入了NULL到队列中,在队列中取出节点是,如果遇到NULL,直接continue继续循环即可);
  6. 重复上述过程直到队列中元素全部取出后,遍历完成。

代码

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    vector<int> PrintFromTopToBottom(TreeNode* root) {
        vector<int> res;
        if( root == NULL )
            return res;
        queue<TreeNode*> q;
        q.push( root );
        while( !q.empty() )
        {
            TreeNode* temp = q.front();
            q.pop();
            if( temp == NULL )
                continue;
            res.push_back(temp->val);
            q.push(temp->left);
            q.push(temp->right);
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_36132127/article/details/80197013