完全二叉樹 -- 已知先序遍歷,求中序遍歷

大體思路

  1. 一直*2, 直到小於總結點數, – 左節點
  2. 在(1)不成立的情況下+1, 並且要注意臨界點(下標不能超過總結點數和因爲是先序, 所以父節點存在) – 右節點
  3. 由左節點產生的樹遍歷完, 要找其兄弟節點

詳細思路見代碼

具體實現

#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讀取, 數據見下面
我取的數據爲層次遍歷是遞增的結果. 方便校驗.
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章