/**
* 實驗題目:
* 求二叉排序樹中兩個結點的最近公共祖先
* 實驗目的:
* 掌握二叉排序樹的遞迴查詢過程及其演算法設計
* 實驗內容:
* 設計程式,構造一顆二叉排序樹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 原理 二叉搜尋樹是排序過的 位於左子樹的結點都比父結點小,位於右子樹的結點都比父結點大,我們只需從根節點開始和兩個輸入的結點進行比較,如果當前節點的值比兩個結點的值都大,那麼最低的公共祖先結點一定在該結點的左子樹中,下一步開遍歷當前結點的左子樹。如果當前節點的值比兩個結點的值都小,那麼最低的公共...