題目
假設二叉樹採用二叉鏈表存儲結構存儲,編寫一個程序,輸出先序遍歷序列中第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;
}
}
}