/**
* 實驗題目:
* 由有序序列建立一顆高度最小的二叉排序樹
* 實驗目的:
* 掌握二叉排序樹的構造過程及其演算法設計
* 實驗內容:
* 設計程式,對於給定的乙個有序的關鍵字序列,建立一顆高度
* 最小的二叉排序樹。
* 解決思路:
* 要建立一顆高度最小的二叉排序樹,就必須讓左右子樹的結點
* 個數越接近越好。由於給定的是乙個關鍵字有序序列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...
有序陣列建立高度最小的二叉查詢樹
題目 給定乙個整數陣列,元素各不相同且按公升序排列,編寫乙個演算法,建立乙個高度最小的二叉查詢樹。解法 二叉查詢樹的特點是根的左子樹都比根結點小,右子樹都比根結點大,左右子樹結點數目相同時有望時樹的高度最小。因此根結點可以取陣列的中位數。左子結點為陣列前半段的中位數,右子結點為陣列後半段的中位數,遞...