考研數據結構之樹(6.10)——練習題之輸出先序遍歷序列中第k個結點的值(C表示)

題目

假設二叉樹採用二叉鏈表存儲結構存儲,編寫一個程序,輸出先序遍歷序列中第k個結點的值,假設k不大於總的結點樹(結點data域類型爲char類型)。

分析

使用先序遍歷,用一個變量計算當前結點是整個先序遍歷序列的第幾個結點,然後與k比較,是否相等,然後來輸出對應結點的值。

代碼

核心代碼:

/* 輸出先序遍歷中第k個結點的值 */
/* 例:ABC##DE##F##GH### */ 
int n=0;// 定義全局變量n,將結點計數初值爲0
void trave(BTNode *p,int k) {
	if(p!=NULL) {
		n++;// 當第一次來到一個結點的時候進行計數,表示這是第n個結點
		if(k==n) { // 當第一次來到一個結點的時候進行判斷,看這個結點是否是先序序列中的第k個結點
			printf("%c",p->data);// 如果是,則輸出該結點的值
			return;// 並且無繼續遍歷,用return直接返回
		}
		trave(p->lchild,k);
		trave(p->rchild,k);
	}
}

完整代碼:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

/* 數結構體類型定義*/
typedef struct BTNode {
	char data;// 這裏默認結點data域爲char類型
	struct BTNode *lchild;// 左孩子指針域
	struct BTNode *rchild;// 右孩子指針域
} BTNode,*BiTree;

/* 根據輸入創建二叉樹 */
/* 例:ABC##DE##F##GH### */
void CreatBiNode(BTNode **Node) { //此處應注意傳遞的參數(二重指針)
	char data;
	scanf("%c", &data);

	*Node = (BiTree)malloc(sizeof(BTNode));
	if (data == '#') {
		*Node = NULL;
	} else if ((data != '#') && (*Node)) {
		(*Node)->data = data;
		(*Node)->lchild = NULL;
		(*Node)->rchild = NULL;
		CreatBiNode(&(*Node)->lchild);
		CreatBiNode(&(*Node)->rchild);
	}
}

/* 輸出先序遍歷中第k個結點的值 */
/* 例:ABC##DE##F##GH### */ 
int n=0;// 定義全局變量n,將結點計數初值爲0
void trave(BTNode *p,int k) {
	if(p!=NULL) {
		n++;// 當第一次來到一個結點的時候進行計數,表示這是第n個結點
		if(k==n) { // 當第一次來到一個結點的時候進行判斷,看這個結點是否是先序序列中的第k個結點
			printf("%c",p->data);// 如果是,則輸出該結點的值
			return;// 並且無繼續遍歷,用return直接返回
		}
		trave(p->lchild,k);
		trave(p->rchild,k);
	}
}


int main() {
	printf("先序輸入二叉樹(空結點用'#'表示):");
	BiTree T=NULL;
	CreatBiNode(&T);// 創建二叉樹

	/* 輸出先序遍歷序列中第k個結點的值 */ 
	trave(T,4);

	return 0;
}

運行結果:

中序遍歷序列查找第k個結點的值代碼:

int n=0;
void trave(BTNode *p,int k){
	if(p!=NULL){
		trave(p->lchild,k);
		n++;
		if(k==n){
			printf("%c",p->data);
			return;
		}
		trave(p->rchild,k);
	}
}

後序遍歷序列查找第k個結點的值代碼:

int n=0;
void trave(BTNode *p,int k){
	if(p!=NULL){
		trave(p->lchild,k);
		trave(p->rchild,k);
		n++;
		if(k==n){
			printf("%c",p->data);
			return;
		}
	}
}

 

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