標籤:
在備考資料結構單元測試的過程中,無意間學到了c++中的姿勢。大大的驚喜。原題為SWUST OJ 972題。
統計利用先序遍曆建立的二叉樹的寬度
(0972)Time limit(ms): 1000Memory limit(kb): 10000Submission: 1154Accepted: 653Accepted Description
利用先序遞迴遍曆演算法建立二叉樹並計算該二叉樹的寬度。先序遞迴遍曆建立二叉樹的方法為:按照先序遞迴遍曆的思想將對二叉樹結點的抽象訪問具體化為根據接收的資料決定是否產生該結點從而實現建立該二叉樹的二叉鏈表格儲存體結構。約定二叉樹結點資料為單個大寫英文字元。當接收的資料是字元”#”時表示該結點不需要建立,否則建立該結點。最後再統計建立完成的二叉樹的寬度(是指二叉樹每層節點數的最大值)。需要注意輸入資料序列中的”#”字元和非”#”字元的序列及個數關係,這會最終決定建立的二叉樹的形態。
Input
輸入為接受鍵盤輸入的由大寫英文字元和”#”字元構成的一個字串(用於建立對應的二叉樹)。
Output
輸出該用例對應的二叉樹的寬度。
Sample Input
123456 |
A##ABC####AB##C##ABCD###EF##G###A##B## |
Sample Output
AC原始碼:
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<iostream>
using namespace std;
#define max(a,b) a>b?a:b
int i;
typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}BTNode;int main()
{
void CreatTree(BTNode *&t,char str[]); //定義時要指出形參的資料類型,調用時才可以直接在相應位置用名字
int width(BTNode *t);
BTNode *t;
char str[100];
while(scanf("%s",str)!=EOF)
{
i=0;
CreatTree(t,str);
printf("%d",width(t));
}
return 0;
}
void CreatTree(BTNode *&t,char str[])
{
if(str[i]!=‘#‘)
{
t=(BTNode *)malloc(sizeof(BTNode));
t->data=str[i];
i++;
CreatTree(t->lchild,str);
CreatTree(t->rchild,str);
}
else
{
t=NULL;
i++;
}
}
int width(BTNode *t)
{
if(t==NULL)
return 0;
int mx=0,cnt;
BTNode *p;
queue<BTNode *>queA,queB; //queue模板類的定義
queA.push(t); //queue的基本操作之入隊,將t元素接到隊列的末端
while(!queA.empty())
{
cnt=0;
while(!queA.empty())
{
cnt++;
p=queA.front();
if(p->lchild!=NULL)
queB.push(p->lchild);
if(p->rchild!=NULL)
queB.push(p->rchild);
queA.pop(); //出隊:如q.pop() 彈出隊列的第一個元素,並不會返回元素的值;
}
mx=max(mx,cnt);
queA=queB;
while(!queB.empty())
queB.pop();
}
return mx;
}
涉及的知識:
queue模版類的定義在<queue>標頭檔中。
queue與stack模版非常類似,queue模版也需要定義兩個模版參數,一個是元素類型,一個是容器類型,元素類型是必要的,容器類型是可選的,預設為dqueue類型。
定義queue對象的範例程式碼如下:
queue<int>q1;
queue<double>q2;
queue的基本操作有:
1.入隊:如q.push(x):將x元素接到隊列的末端;
2.出隊:如q.pop() 彈出隊列的第一個元素,並不會返回元素的值;
3,訪問隊首元素:如q.front()
4,訪問隊尾元素,如q.back();
5,訪問隊中的元素個數,如q.size();
C++queue容器介紹