二叉樹的層次遍歷(建樹避除,遍歷二蓝,釋放)

這題的思路:讀入--》判斷是否為循環(huán)結(jié)束的條件(主動)--》判斷是否
輸入錯誤--》用隊列向vector中輸入合法數(shù)據(jù)--》按順序輸出

a)        編寫readin函數(shù)引镊,專門用來讀取數(shù)據(jù)川慌。函數(shù)返回類型為bool,輸入不合法時返回false祠乃。依題意梦重,如果輸入只有(),表示input終止亮瓷,跳出循環(huán)并返回true

b)        編寫名為Node的結(jié)構(gòu)體琴拧。結(jié)構(gòu)體中包含input中括號左側(cè)的結(jié)值、判斷結(jié)點是否被賦值的bool類型的值嘱支,和類型為Node *的左右子結(jié)點蚓胸。由于二叉樹是遞歸定義的挣饥,其左右子結(jié)點類型都是“指向結(jié)類型的指針”,因此左右子結(jié)點的類型都是Node *

c)        建立全局變量failed沛膳,記錄是否有從根到某個葉結(jié)的路徑上有的結(jié)沒有在輸入中給出或值給出超過一次的情況

d)        建立函數(shù)addnode:按照移動序列走扔枫,目標不存在時調(diào)用newnode函數(shù)來創(chuàng)造新結(jié)點,判斷結(jié)點是否已被賦值(如果已經(jīng)被賦過值锹安,將failed值改為true)短荐,并將結(jié)點值賦給對應(yīng)的結(jié)點

e)        bfs找結(jié)點,使用隊列:初始時只有一個根結(jié)點叹哭,然后每次取出一個結(jié)點忍宋,把它的左右子結(jié)點(如果存在)放進隊列中,用vector保存結(jié)點的值

PS:failed 僅僅是作為continue的條件 真正退出的條件只能是readin讀入到了結(jié)束
failed在外部函數(shù)中出現(xiàn)在了readin里的addnode函數(shù)里 作為重復(fù)賦值的判斷
然后在bfs里有一個是否complete的判斷 也與failed一樣作為能否進入為vector賦值的條件

readin—》addnode—》bfs—》over


include<vector>

include<cstdio>

include<queue>

include<iostream>

include<cstring>

using namespace std;

const int maxn = 256 + 10;
char s[maxn];
bool failed;

struct Node{
int v; //結(jié)點值
bool have_value; //用來判斷是否被賦值過
Node *left, *right; //遞歸定義 左右結(jié)點
};
Node *root;

Node *newnode(){
return new Node(); //每建立一個結(jié)點 用new運算符申請
}

void addnode(int v,char *s){
Node *u = root; //將根節(jié)點指向的地址賦給u進行儲存
int n = strlen(s); //確定循環(huán)次數(shù)
for(int i = 0; i < n; n++){
if(s[i] == 'L'){
if(u->left==NULL){ //如果這個結(jié)點未被創(chuàng)建
u->left = newnode();//那么創(chuàng)建它
u = u->left; //并且將u指向它以進行下一次循環(huán)
}
}
else if(s[i] == 'R'){
if(u->right==NULL){ //同上
u->right=newnode();
u = u->left;
}
}
if(u->have_value) failed = true;//如果它已經(jīng)被創(chuàng)建 那么把標記值賦為ture 以在主函數(shù)中終止此次循環(huán)
u->v=v; //將值賦給新創(chuàng)建的結(jié)點
u->have_value=true; //并做標記风罩,表示該結(jié)點已經(jīng)賦過值
}
}

void remove_tree(Node* u) {
if(u == NULL) return;
remove_tree(u->left);
remove_tree(u->right);
delete u;
}

bool readin(){ //這個函數(shù)是用來讀入的
failed = false;
remove_tree(root);
root = newnode(); //創(chuàng)建根結(jié)點 可能導(dǎo)致內(nèi)存泄漏
for( ; ; ){
if(scanf("%s", s) != 1) return false;//讀到了結(jié)束標志
if(strcmp(s,"()")) break;//比較字符串是否相等
//按照順序比糠排,第一個都是T 第二個都是h 第三個a<e 所以...就這樣。比較方法就是挨個比較超升,利用ASCII碼
//相等返回0 大于返回正整數(shù) 小于返回負整數(shù)
int v;
sscanf(&s[1],"%d",&v); //不管了...
addnode(v,strchr(s,',')+1);//不管 看不懂
}
return true ;
}

bool bfs(vector<int>&ans){
queue<Node*> q; //創(chuàng)建隊列以存放結(jié)點
q.push(root); //將已經(jīng)創(chuàng)建好的樹的根節(jié)點放入隊列
while(!q.empty()){ //當隊列不為空(即未全部按順序加入vector完)
Node *u = q.front(); //創(chuàng)建結(jié)構(gòu)指針 指向隊列頭
q.pop(); //出列
if(!u->have_value) return false;//如果該結(jié)點未被賦值過 則樹不完整 返回false 在主函數(shù)中結(jié)束此次循環(huán)
if(u->left!=NULL) q.push(u->left); //若不為空 則加入隊列中
if(u->right!=NULL) q.push(u->right);//注意先左再右(題目要求)
}//有些樹可能have_value是空的 但是仍為一些結(jié)點的根節(jié)點
return true;
}

int main(){
while(1){
if(!readin()) break;

    vector<int>ans;
    if(!failed&&bfs(ans)){
        int len = ans.size();
        for(int i = 0; i < len; i++){
            printf("%d%c",ans[i],i == len-1?'\n':' ');
        }
    }
    else 
        printf("not complete");
}
return 0;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末入宦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子室琢,更是在濱河造成了極大的恐慌云石,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件研乒,死亡現(xiàn)場離奇詭異,居然都是意外死亡淋硝,警方通過查閱死者的電腦和手機雹熬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谣膳,“玉大人竿报,你說我怎么就攤上這事〖萄瑁” “怎么了烈菌?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長花履。 經(jīng)常有香客問我芽世,道長,這世上最難降的妖魔是什么诡壁? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任济瓢,我火速辦了婚禮,結(jié)果婚禮上妹卿,老公的妹妹穿的比我還像新娘旺矾。我一直安慰自己蔑鹦,他們只是感情好,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布箕宙。 她就那樣靜靜地躺著嚎朽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柬帕。 梳的紋絲不亂的頭發(fā)上哟忍,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音雕崩,去河邊找鬼魁索。 笑死,一個胖子當著我的面吹牛盼铁,可吹牛的內(nèi)容都是我干的粗蔚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼饶火,長吁一口氣:“原來是場噩夢啊……” “哼鹏控!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肤寝,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤当辐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鲤看,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缘揪,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年义桂,在試婚紗的時候發(fā)現(xiàn)自己被綠了找筝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡慷吊,死狀恐怖袖裕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情溉瓶,我是刑警寧澤急鳄,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站堰酿,受9級特大地震影響疾宏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜触创,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一灾锯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗅榕,春花似錦顺饮、人聲如沸吵聪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吟逝。三九已至,卻和暖如春赦肋,著一層夾襖步出監(jiān)牢的瞬間块攒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工佃乘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留囱井,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓趣避,卻偏偏與公主長得像庞呕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子程帕,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359