【問題描述】
給定一顆二叉樹,要求從下至上按層遍歷二叉樹,每層的訪問順序是從左到右,每一層單獨輸出一行。
【輸入形式】
廣義表表示的二叉樹,結點元素型別為整型,且都大於0,例如:1( 2( 3 ( 4, 5 ) ), 6( 7, 8( 9, 10 ) ) )
【輸出形式】
從下至上,列印每一層的結點元素值,元素間以空格隔開。每層的訪問順序是從左到右,每一層單獨輸出一行。
【樣例輸入】
1(2(3(4,5)),6(7,8(9,10))),字串內沒有空格
【樣例輸出】
4 5 9 10
3 7 8
2 61
【樣例說明】
【評分標準】
本題目主要考察兩個知識點:
1.建立二叉樹儲存結構
2.按層次遍歷二叉樹的演算法
/*
由於是倒著從最後一層開始從左至右按層遍歷
所以面臨以下問題:
1.如何根據廣義表構造樹(注意節點不是字母,而是數字(可能是多位數)!!!!!)
2.如何從最後一層依次向上面的層遍歷
3.如何輸出一層之後換行再輸出另一行
針對問題2,只要在按層遍歷的時候從右至左遍歷,最後輸出到陣列裡,再將陣列逆序輸出就好
針對問題3,就是設定乙個東西來記錄節點的層數。這裡用到了二維陣列,int a[2],
其中a[0]用來記錄節點的數字,a[1]用來記錄層數
針對問題1,解決辦法是先用gets將廣義表讀入字串s,然後依次從開頭往後讀,
發現『0』~『9』之間的字元,就放到字元陣列num中,直到不再是『0』~『9』之間的字元,
然後將num轉換成數字(可以用sscanf)
*/#include#include// malloc()
#include// strlen(), memset()
#define maxsize 100
typedef struct node
btnode, *btree;
int a[maxsize][2]; //二維陣列,分別記錄節點值和深度
btree create_bt();
int layer(btree t);
int main()
printf("%d ", a[i][0]);
} return 0;
}btree create_bt()
, num[10] = ;
int flag, top = -1, len, i = 0, j = 0, sum = 0;
fgets(s, maxsize-1, stdin); //先讀到陣列中,這樣做,資料就可以重複讀了!
len = strlen(s);
while(1)
sscanf(num, "%d", &sum); //sscanf字串轉數字
}else
i++; //如果不是數字,要i++,下次就可以讀下乙個字元
if( ch == '\n' || i >= len) //發現'\n'或者是s到頭了就返回
return t;
else
else if(flag == 1)
else
}} }
}int layer(btree t)
} return --i; //返回節點個數!別忘了是--i
}
按層遍歷二叉樹
include include typedef struct bitnodebitnode,bitree 定義二叉樹型別 typedef struct qnodeqnode,queueptr 建立鏈 typedef struct linkqueue 建立佇列 void enqueue linkque...
四 二叉樹按層遍歷(BFS)
二叉樹特點 葉子節點最多兩個,分為左葉子節點和右葉子節點。思路 將每一層節點放入list集合或者佇列,遍歷完當前層再繼續遍歷下一層。class treenode public class treetest public static void levelprintln treenode root i...
BST 二叉搜尋樹 按層遍歷
這個是很快的乙個充滿bug的版本,很快會更新。按層遍歷。舉個例子 利用了stl的deque,如下 include include using namespace std struct bstnode dequesq void insert bstnode p,int elem if elem p v...