在二叉樹中查找指定值結點的所有祖先


 

 

#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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM