由有序序列建立一顆高度最小的二叉排序樹

2021-09-10 18:50:09 字數 2855 閱讀 1802

/**

*    實驗題目:

*        由有序序列建立一顆高度最小的二叉排序樹

*    實驗目的:

*        掌握二叉排序樹的構造過程及其演算法設計

*    實驗內容:

*        設計程式,對於給定的乙個有序的關鍵字序列,建立一顆高度

*    最小的二叉排序樹。

*    解決思路:

*        要建立一顆高度最小的二叉排序樹,就必須讓左右子樹的結點

*    個數越接近越好。由於給定的是乙個關鍵字有序序列a[start...end],

*    所以讓其中間位置的關鍵字a[mid]作為根結點,左序列a[start...mid-1]

*    構造左子樹,右序列a[mid+1...end]構造右子樹。

*/#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)}}

/*-------------------建立一顆二叉排序樹--------------------*/

bstnode *create_bst1(key_type a, int start_pos, int end_pos)

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

;bt = create_bst1(a, 0, n - 1);

printf("bst:");

disp_bst(bt);

printf("\n");

destroy_bst(bt);

return 0;

}測試結果:

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

用檔案建立一顆二叉樹

本次使用到的類有 fstream類 string類 include fstream include string 首先建立乙個txt文字 這代表了一棵二叉樹 如圖 三個符號分別對應 資料 左孩子 右孩子 存在為1,不存在為0 於是需要兩個函式。第乙個把檔案轉化為陣列,第二個把陣列轉化為二叉樹。在這裡...

判斷一顆二叉樹是是否是另一顆樹的子樹。

什麼樣的情況下,某一棵樹會成為另一棵樹的子數呢?子樹的根節點是某一棵樹的某個節點,接下來的子節點也相同,則該樹是另一棵樹的子集。首先找到與根節點相同的節點,在進行遍歷,可使用遞迴法。template struct treenode template bool check treenode root1...

有序陣列建立高度最小的二叉查詢樹

題目 給定乙個整數陣列,元素各不相同且按公升序排列,編寫乙個演算法,建立乙個高度最小的二叉查詢樹。解法 二叉查詢樹的特點是根的左子樹都比根結點小,右子樹都比根結點大,左右子樹結點數目相同時有望時樹的高度最小。因此根結點可以取陣列的中位數。左子結點為陣列前半段的中位數,右子結點為陣列後半段的中位數,遞...