1. 程式人生 > >二叉樹的遞迴建立,以及二叉查詢樹查詢的建立 和遍歷查詢的比較

二叉樹的遞迴建立,以及二叉查詢樹查詢的建立 和遍歷查詢的比較

二叉樹的遞迴建立  、以及二叉查詢樹查詢的建立 和遍歷查詢的比較

(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 ; 
}