题目描述:从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。即层次遍历。
二叉树结点定义:
struct BinTreeNode{
int m_value;
BinTreeNode *left;
BinTreeNode *right;
//创建根节点,值为e
BinTreeNode* createRoot(int e);
//将e作为当前结点的左孩子值插入
void insertAsLC(int e);
//将e作为当前结点的右孩子值插入
void insertAsRC(int e);
};
解题思路:
- 使用容器队列,利用其先进先出的特点。
- 每次先打印根节点,若其有子节点,则将子节点全部放入队列的队尾。
- 接下来从头部取出头节点,知道队列没有元素入队,并且遍历队列所有元素,直至其为空
测试用例:
int main(){
//创建一颗二叉树
BinTreeNode *tree = new BinTreeNode;
tree->m_value = 8;
BinTreeNode *tree2 = new BinTreeNode;
tree2 = NULL;
tree->insertAsLC(6); //左孩子为6
tree->insertAsRC(10);
tree->left->insertAsLC(5);
tree->left->insertAsRC(7);
tree->right->insertAsLC(9);
tree->right->insertAsRC(11);
//从上到下打印二叉树,即层次遍历
PrintFromTopToBotto(tree2); //Output: 8 6 10 5 7 9 11
return 0;
}
函数实现:
void PrintFromTopToBotto(BinTreeNode *treeRoot){
if(treeRoot == NULL)
return;
//辅助队列
deque<BinTreeNode*> treeNode;
//根节点入队
treeNode.push_back(treeRoot);
//当前队列不为空
while(!treeNode.empty()){
//输出队首元素
BinTreeNode *pNode = treeNode.front();
treeNode.pop_front();
std::cout << pNode->m_value << " ";
//若有左孩子,入队
if(pNode->left)
treeNode.push_back(pNode->left);
if(pNode->right)
treeNode.push_back(pNode->right);
}
}
其他函数实现:
//其他函数实现
//创建根节点,值为e
BinTreeNode* BinTreeNode::createRoot(int e){
BinTreeNode *root = new BinTreeNode;
root->m_value = e;
return root;
}
//作为节点的左孩子插入元素e
void BinTreeNode::insertAsLC(int e){
BinTreeNode *Left = new BinTreeNode;
Left->m_value = e;
this->left = Left;
}
//作为节点的右孩子插入元素e
void BinTreeNode::insertAsRC(int e){
BinTreeNode *Right = new BinTreeNode;
Right->m_value = e;
this->right = Right;
}