数据结构与算法面试题80道(16)
第16题:
题目(微软):
输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
例如输入
8
/ \
6 10
/ \ / \
5 7 9 11
输出8 6 10 5 7 9 11。
不想吐槽了,和上题简直一模一样。我是直接复制的上一题代码,将sawp函数直接换成了一个输出语句,就可以了
说下思路,层次遍历,明显就是把8放进去,拿出来,然后把6,10放进去,把6拿出来,把5,7放进去,把10拿出来, 把9,11放进去,然后一个一个往外拿,边拿边输出值。明显就是队列。早知道上题用栈写了,好歹是不同的代码。
贴代码了
#include<iostream> #include<queue> using namespace std; struct BSTreeNode{ int m_nValue; BSTreeNode *m_pLeft; BSTreeNode *m_pRight; }; void addNode(BSTreeNode *&root,int value){ if(root==NULL){ BSTreeNode *tree=new BSTreeNode(); if(tree==NULL) {cout<<"内存错误"<<endl;return ;} tree->m_nValue=value; tree->m_pLeft=NULL; tree->m_pRight=NULL; root=tree; }else if(root->m_nValue>value) addNode(root->m_pLeft,value); else if(root->m_nValue<value) addNode(root->m_pRight,value); else cout<<"结点重复"<<endl; } void loopTree(BSTreeNode *root){ queue<BSTreeNode*>q; q.push(root); while(!q.empty()){ BSTreeNode *t=q.front(); q.pop(); cout<<t->m_nValue<<" "; if(t->m_pLeft!=NULL) q.push(t->m_pLeft); if(t->m_pRight!=NULL) q.push(t->m_pRight); } } int main(){ //建树 BSTreeNode *root=NULL; addNode(root,8); addNode(root,6); addNode(root,10); addNode(root,5); addNode(root,7); addNode(root,9); addNode(root,11); loopTree(root); cout<<endl; return 0; }