求二叉排序樹中兩個結點的最近公共祖先

2021-09-10 19:26:46 字數 3668 閱讀 8236

/**

*    實驗題目:

*        求二叉排序樹中兩個結點的最近公共祖先

*    實驗目的:

*        掌握二叉排序樹的遞迴查詢過程及其演算法設計

*    實驗內容:

*        設計程式,構造一顆二叉排序樹bt,輸出bt中關鍵字分別為x、y

*    的結點的最近公共祖先lca。

*/#include

#include

#include

#define max_size 100

typedef int key_type;           // 定義關鍵字型別

typedef char info_type;

typedef struct node bstnode;

/*----------------以括號表示法輸出二叉排序樹bt------------------*/

void disp_bst(bstnode *bt);         // 函式宣告

bool insert_bst(bstnode *&bt, key_type key) // 在以bt為根結點的bst中插入乙個關鍵字為key的結點

else if(key == bt->key)

return false;

else if(key < bt->key)

return insert_bst(bt->lchild, key);     // 插入到bt結點的左子樹中

else

return insert_bst(bt->rchild, key);     // 插入到bt結點的右子樹中

}/*----------------由陣列a中的關鍵字建立一顆二叉排序樹------------------*/

bstnode *create_bst(key_type a, int n)

}return bt;

}/*----------------以括號表示法輸出二叉排序樹bt------------------*/

void disp_bst(bstnode *bt)}}

key_type predt = -32767;                            // predt為全域性變數,儲存當前結點中序前驅的值,初值為-∞

/*----------------判斷bt是否為bst------------------*/

bool judge_bst(bstnode *bt)

}/*----------------銷毀一顆bst------------------*/

void destroy_bst(bstnode *bt)

}/*----------------以非遞迴方式輸出從根結點到查詢到的結點的路徑------------------*/

void search_bst1(bstnode *bt, key_type key, key_type path, int i)

printf("\n");

}else

}/*----------------以遞迴方式輸出從根結點到查詢到的結點的路徑------------------*/

int search_bst2(bstnode *bt, key_type key)

else if(key < bt->key)

else

printf("%3d", bt->key);                 // 輸出關鍵字

}/*----------------被刪除的結點p有左、右子樹,r指向其左孩子------------------*/

void delete_node1(bstnode *p, bstnode *&r)      // 指標的引用

else                                        // 找到最右下結點r(它沒有右子樹)

}/*----------------從二叉排序樹中刪除p結點------------------*/

void delete_node(bstnode *&p)

else if(p->lchild == null)                          // p結點沒有左子樹的情況

else

delete_node1(p, p->lchild);                     // p結點既有左子樹又有右子樹的情況

}/*----------------在bt中刪除關鍵字為key的結點------------------*/

bool delete_bst(bstnode *&bt, key_type key)}}

/***   功能:

*       在二叉排序樹bt中求x和y結點的最近公共祖先,並返回該結點的指標

*   演算法思路:

*       設lca(bt, x, y)返回二叉排序樹bt中x、y結點的最近公共祖先的指標,

*   當不存在任何公共祖先時,返回空指標。根據二叉排序樹的性質得到如下

*   遞迴模型:

*   1、當bt為空時,lca(bt, x, y) = null

*   2、當x、y均小於bt->key時,lca(bt, x, y) = lca(bt->lchild, x, y)

*   3、當x、y均大於bt->key時,lca(bt, x, y) = lca(bt->rchild, x, y)

*   4、當x、y結點分別位於bt的左、右子樹中,lca(bt, x, y) = bt

*/static bstnode *lca(bstnode *bt, key_type x, key_type y)

int main(int argc, char *ar**)

;key_type n = 9;

printf("(1)構造二叉排序樹bt\n");

bt = create_bst(a, n);                              //  建立一顆二叉排序樹

printf("(2)輸出bst:");

disp_bst(bt);

printf("\n");

printf("(3)查詢%d和%d結點的最近公共祖先\n", x, y);

if(p = lca(bt, x, y))

printf("   最近公共祖先是:%d\n", p->key);

else

printf("   指定的關鍵字不存在\n");

printf("(4)銷毀bt");

destroy_bst(bt);

printf("\n");

return 0;

}測試結果:

(1)構造二叉排序樹bt

第1步,插入5:5

第2步,插入2:5(2)

第3步,插入1:5(2(1))

第4步,插入6:5(2(1),6)

第5步,插入7:5(2(1),6(,7))

第6步,插入4:5(2(1,4),6(,7))

第7步,插入8:5(2(1,4),6(,7(,8)))

第8步,插入3:5(2(1,4(3)),6(,7(,8)))

第9步,插入9:5(2(1,4(3)),6(,7(,8(,9))))

(2)輸出bst:5(2(1,4(3)),6(,7(,8(,9))))

(3)查詢1和4結點的最近公共祖先

最近公共祖先是:2

(4)銷毀bt

計算二叉排序樹兩個結點間的結點數

13 在一棵高度為o logn 的二叉排序樹的結點上儲存著浮點數,請用c語言寫乙個函式來計算一棵樹上界於任意倆個浮點數x1和x2 x1 include include using namespace std typedef struct btnode btnode 二叉排序樹插入結點 int bst...

B 二叉排序樹(比較兩個二叉排序樹)

description 二叉排序樹的定義是 或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉排序樹。今天我們要判斷兩序列是否為同一二叉排序樹 input ...

求二叉樹中兩個節點的最近公共祖先結點

1 原理 二叉搜尋樹是排序過的 位於左子樹的結點都比父結點小,位於右子樹的結點都比父結點大,我們只需從根節點開始和兩個輸入的結點進行比較,如果當前節點的值比兩個結點的值都大,那麼最低的公共祖先結點一定在該結點的左子樹中,下一步開遍歷當前結點的左子樹。如果當前節點的值比兩個結點的值都小,那麼最低的公共...