#include<stdio.h>
#include<stdlib.h>
//用二叉鏈表存儲方式建樹(完全二叉樹)
typedef struct BitTree {
int data;
struct BitTree* LChild; //左子樹
struct BitTree* RChild; //右子樹
}bittree;
//創建二叉樹
bittree* createBitTree(bittree* BT) {
int num = 0;
scanf("%d", &num);
if (num != -1) { //輸入-1代表結束
BT = (bittree*)malloc(sizeof(bittree));
BT->data = num;
printf("輸入%d的左結點值:", BT->data);
BT->LChild = createBitTree(BT->LChild);
printf("輸入%d的右結點值:", BT->data);
BT->RChild = createBitTree(BT->RChild);
}
else {
BT = NULL; //輸入-1,結點為NULL
}
return BT;
}
//先序遍歷
void PrePrint(bittree* BT) {
if (BT != NULL) {
printf("%d ", BT->data);
PrePrint(BT->LChild);
PrePrint(BT->RChild);
}
else { //結點為NULL,返回上一層
return;
}
}
//方式一
/*
int flag = 0; //定義一個全局變量來判斷是否查找到了值
void PrintAncestors(bittree* BT, int x) {
if (!BT)
return;
if (BT->data == x) {
flag = 1; //查詢到值的時候 改變標志位
return;
}
if (flag == 0) {
PrintAncestors(BT->LChild, x); //若沒有查找到往節點的左側查找
}
if (flag == 0)
PrintAncestors(BT->RChild, x);//若沒有查找到往節點的右側查找
if (flag == 1) {
printf("%d ", BT->data);
}
}
*/
//方式二
int PrintAncestors(bittree* BT, char x) {
if (!BT)
return 0;
if (BT->data == x) {
return 1;
}
//這個可以這樣理解
//如果一顆二叉樹他的左孩子有要查詢的結點或者他的右孩子里面有要查詢的結點那么該節點就是祖先結點
if (PrintAncestors(BT->LChild, x) || PrintAncestors(BT->RChild, x)) {
printf("%d ", BT->data);
return 1;
}
else {
return 0;
}
}
void main() {
int num = 0;
bittree* myBT = NULL;
myBT = createBitTree(myBT);
printf("先序遍歷二叉樹:\n");
PrePrint(myBT);
printf("\n");
printf("請輸入你要查找的值:");
scanf("%d", &num);
//printf("開始尋找%d的所有祖先:\n", num);
printf("%d的所有祖先是:\n", num);
PrintAncestors(myBT, num);
}

參考自:https://blog.csdn.net/qq_41934478/article/details/98121209
