题意:给出一棵二叉搜索树的插入序列,要求该树最后两层的结点个数。
思路:在树结点中增加一个数据域layer,表示该结点所在的层次。另外,设置数组level[]和变量maxLevel,level[i]表示第i层的结点个数,maxLevel表示树的最大层次,在层序遍历时更新即可。
代码:
#include#include using namespace std;int level[1005]={ 0};int maxLevel=0;struct Node{ int val; int layer; Node *lchild,*rchild; Node(int v):val(v),layer(1),lchild(NULL),rchild(NULL){} };void insert(Node* &root,int val){ if(root==NULL) { root=new Node(val); return; } if(val<=root->val) insert(root->lchild,val);//根据题意,这里是<=,要仔细! else insert(root->rchild,val);}void levelOrderTraversal(Node* root){ queue q; root->layer=1; q.push(root); while(!q.empty()){ Node* pNode=q.front(); q.pop(); level[pNode->layer]++; if(pNode->layer > maxLevel) maxLevel=pNode->layer; if(pNode->lchild){ pNode->lchild->layer=pNode->layer+1; q.push(pNode->lchild); } if(pNode->rchild){ pNode->rchild->layer=pNode->layer+1; q.push(pNode->rchild); } } }int main(){ int n,v; scanf("%d",&n); Node* root=NULL; while(n--){ scanf("%d",&v); insert(root,v); } levelOrderTraversal(root); printf("%d + %d = %d",level[maxLevel],level[maxLevel-1],level[maxLevel-1]+level[maxLevel]); return 0; }