大體思路
- 一直*2, 直到小於總結點數, – 左節點
- 在(1)不成立的情況下+1, 並且要注意臨界點(下標不能超過總結點數和因爲是先序, 所以父節點存在) – 右節點
- 由左節點產生的樹遍歷完, 要找其兄弟節點
詳細思路見代碼
具體實現
#include <stdio.h>
#define MAX 100
int tree[MAX];
int tmp[MAX];
void inPrintTree(int i, int n){
if(i <= n){
inPrintTree(2*i, n);
printf("%d ", tree[i]);
inPrintTree(2*i+1, n);
}
}
int main(){
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
scanf("%d", &tmp[i]);
}// 默認節點值 > 0
int cur = 1;
tree[cur] = tmp[cur];
for(int i = 2; i <= n; ++i){
if(cur * 2 <= n){ // 一直*2 知道小於總結點樹
cur *= 2;
tree[cur] = tmp[i];
printf("左節點的值爲: %d , cur = %d\n", tree[cur], cur);
}else if( cur+1 <= n && tree[cur+1] == 0 && tree[(cur+1)/2] != 0) { // cur + 1 即右節點, 但有前提, cur + 1 <= n和tree[(cur+1)/2] != 0
cur ++;
tree[cur] = tmp[i];
printf("右節點的值爲: %d, cur = %d\n", tree[cur], cur);
}else{
// 當前是左節點. 上一級就是直接找到兄弟節點
// 當前是右節點. 就需要循環至當前節點是左節點位置. 判斷依據爲 cur是否是奇數, 是奇數表示是右節點
while( 1 == cur%2){
cur /= 2;
}
cur ++;
tree[cur] = tmp[i];
printf("上一層右節點的值爲: %d, cur = %d\n", tree[cur], cur);
}
}
printf("層次遍歷: \n");
for(int i = 1; i <= n; ++i){
printf("%d ", tree[i]);
}
printf("\n");
printf("中序遍歷: \n");
inPrintTree(1, n);
printf("\n");
return 0;
}
運行結果
輸入從data.in讀取, 數據見下面
我取的數據爲層次遍歷是遞增的結果. 方便校驗.