题目:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
思路:
很明显,这是一个广度优先遍历。
需要一个队列容器来保存结点,具体操作:
1、将根结点压入队列中,并打印根结点;如果根结点有子结点,将左右子结点依次压入队列的尾部;
2、如果队列不为空,从队列头部取出结点,重复步骤1,直至队列为空。
推广:
不管是广度优先遍历一个有向图还是一棵树,都要用到队列;
第一步就把起始结点(对树而言是根节点)放入队列中;接下来每一次从队列的头部取出一个结点,遍历这个结点之后把从它能到达的结点(对树而言是子结点)都依次放入队列;重复这个遍历过程,直到队列中的结点全部被遍历为止。
代码:
struct TreeNode{ int val; TreeNode* left; TreeNode* right;};void PrintFromTopToBottom(TreeNode* root){ if(root==NULL) return; std::dequedequeTree; 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 PrintFromTopToBottom(TreeNode *root) { std::vector data; if(root!=NULL){ std::dequedequeTreeNode; 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; }};