(剑指Offer)面试题23:从上到下打印二叉树

题目:

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

思路:

很明显,这是一个广度优先遍历。

需要一个队列容器来保存结点,具体操作:

1、将根结点压入队列中,并打印根结点;如果根结点有子结点,将左右子结点依次压入队列的尾部;

2、如果队列不为空,从队列头部取出结点,重复步骤1,直至队列为空。

推广:

不管是广度优先遍历一个有向图还是一棵树,都要用到队列;

第一步就把起始结点(对树而言是根节点)放入队列中;接下来每一次从队列的头部取出一个结点,遍历这个结点之后把从它能到达的结点(对树而言是子结点)都依次放入队列;重复这个遍历过程,直到队列中的结点全部被遍历为止。

代码:

struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
};

void PrintFromTopToBottom(TreeNode* root){
    if(root==NULL)
        return;
    std::deque<TreeNode*> dequeTree;
    dequeTree.push_back(root);
    TreeNode* node;
    while(!dequeTree.empty()){
        node=dequeTree.front();
        dequeTree.pop_front();
        printf("%d ",node->val);

        if(root->left)
            dequeTree.push_back(root->left);
        if(root->right)
            dequeTree.push_back(root->right);
    }
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/7fe2212963db4790b57431d9ed259701?rp=1

AC代码:

class Solution {
public:
    vector<int> PrintFromTopToBottom(TreeNode *root) {
		std::vector<int> data;
        if(root!=NULL){
            std::deque<TreeNode*> dequeTreeNode;
        	dequeTreeNode.push_back(root);
        	TreeNode* node;
        	while(!dequeTreeNode.empty()){
            	node=dequeTreeNode.front();
            	dequeTreeNode.pop_front();
            	data.push_back(node->val);
            
            	if(node->left)
                	dequeTreeNode.push_back(node->left);
            	if(node->right)
                	dequeTreeNode.push_back(node->right);
        	}
        }
        return data;
    }
};

  

    原文作者:AndyJee
    原文地址: https://www.cnblogs.com/AndyJee/p/4651379.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞