二叉樹的遞迴建立,以及二叉查詢樹查詢的建立 和遍歷查詢的比較
阿新 • • 發佈:2019-02-15
二叉樹的遞迴建立 、以及二叉查詢樹查詢的建立 和遍歷查詢的比較
(1)二叉樹的遞迴建立和二叉樹的陣列表示法非常相似,可參考二叉樹的陣列建立
(2)二叉查詢樹的特性
1)每一個結點的值都不相同,也就是說整棵樹中的每一個結點都擁有不同的值。
2)每一個結點的資料大於左子樹結點,但是小於右子樹結點。
3)左、右兩部分的子樹,也是一顆二叉查詢樹。
和遍歷查詢相比,遍歷查詢需要查詢左右兩顆子樹,而二叉查詢樹只需要查詢左右子樹的某個子樹都可以。
下面是二叉查詢樹的實現過程,為了便於比較,順便也附上了遍歷查詢的程式碼。
#include<stdio.h> #include<stdlib.h> struct tree { int data; struct tree *left; struct tree *right; }; typedef struct tree treenode; typedef treenode *btree; btree creatbtree( int *data,int pos ) { btree newnode; if(data[pos] == 0|| pos > 15 ) return NULL; else { newnode = (btree)malloc(sizeof(treenode)); newnode->data = data[pos]; newnode->left = creatbtree(data,2*pos); newnode->right = creatbtree(data,2*pos+1); return newnode; } } btree btreefind(btree ptr,int value) { while( ptr != NULL ) { if( ptr->data == value ) { return ptr; } else if ( ptr->data > value) ptr = ptr->left; else ptr = ptr->right; } } btree btreesearch(btree ptr,int value) { btree ptr1,ptr2; if( ptr != NULL ) { if ( ptr->data == value) return ptr ; else ptr1 = btreesearch(ptr->left,value); ptr2= btreesearch(ptr->right,value); if( ptr1 != NULL) return ptr2; else return NULL; } else return NULL; } int main() { btree root = NULL; btree ptr = NULL; int value; int data[16] ={0,5,4,6,2,0,0,8,1,3,0,0,0,0,7,9}; root = creatbtree(data,1); printf("請輸入尋找結點資料(1 —— 9)\n"); scanf("%d",&value); ptr = btreefind(root,value); if( ptr != NULL ) printf("二叉查詢樹:結點資料是 %d\n",ptr->data); else printf("二叉查詢樹沒有找到\n"); ptr = btreesearch(root,value); if( ptr != NULL ) printf("遍歷查詢:結點資料是 %d\n",ptr->data); else printf("二叉查詢樹沒有找到\n"); return 0 ; }