二叉排序樹(二叉尋找樹)

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   使用   ar   strong   

參考:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.3.1.1.htm

 1 #include "stdafx.h" 2 #include <iostream> 3  4 typedef int InfoType;       //其它資料域,自訂 5 typedef int KeyType;        //假定關鍵字類型為整數 6 typedef struct node         //結點類型 7 {  8     KeyType key;            //關鍵字項 9     InfoType otherinfo;     //其它資料域,InfoType視應用情況而定,下面不處理它10     node *lchild, *rchild;  //左右孩子指標11 }BSTNode;12 typedef BSTNode *BSTree;    //BSTree是二叉排序樹的類型13 14 //非遞迴15 void InsertBSTNode(BSTree *Tptr, KeyType key)16 {//若二叉排序樹 *Tptr中沒有關鍵字為key,則插入,否則直接返回17     BSTNode *f, *p = *Tptr; //p的初值指向根結點18     while(p)19     {20         if(p->key==key) //樹中已有key,無須插入21             return;22         f = p; //記錄23         p = key < p->key ? p->lchild : p->rchild;24     }25     p = new BSTNode;26     p->key = key;27     p->lchild = NULL;28     p->rchild = NULL;29     if(NULL == *Tptr)30         *Tptr = p;31     else32     {33         if (key < f->key)34             f->lchild = p;    35         else36             f->rchild = p;37     }    38 }39 40 BSTree CreateBSTree(KeyType *array, int size)41 {42     BSTNode *root = NULL;43     for (int i=0;i<size;++i)44         InsertBSTNode(&root, array[i]);45     return root;46 }47 48 int _tmain(int argc, _TCHAR* argv[])49 {50     int array[] = {5,3,7,2,4,8};51     int size = sizeof(array)/sizeof(int);52     BSTree tree = CreateBSTree(array, size);53     system("pause");54     return 0;55 }

使用偵錯模式查看構建的二叉尋找樹如

 

(1) 二叉排序樹的插入和產生
①二叉排序樹插入新結點的過程
  在二叉排序樹中插入新結點,要保證插入後仍滿足BST性質。其插入過程是:
  (a)若二叉排序樹T為空白,則為待插入的關鍵字key申請一個新結點,並令其為根;
  (b)若二叉排序樹T不為空白,則將key和根的關鍵字比較:
         (i)若二者相等,則說明樹中已有此關鍵字key,無須插入。
         (ii)若key<T→key,則將key插入根的左子樹中。
         (iii)若key>T→key,則將它插入根的右子樹中。
  子樹中的插入過程與上述的樹中插入過程相同。如此進行下去,直到將key作為一個新的葉結點的關鍵字插入到二叉排序樹中,或者直到發現樹中已有此關鍵字為止。

  ②二叉排序樹插入新結點的遞迴演算法 
     【參見參考書目】

  ③二叉排序樹插入新結點的非遞迴演算法
    void InsertBST(BSTree *Tptr,KeyType key)
      { //若二叉排序樹 *Tptr中沒有關鍵字為key,則插入,否則直接返回
        BSTNode *f,*p=*TPtr; //p的初值指向根結點
        while(p){ //尋找插入位置
          if(p->key==key) return;//樹中已有key,無須插入
          f=p; //f儲存當前尋找的結點
          p=(key<p->key)?p->lchild:p->rchild;
            //若key<p->key,則在左子樹中尋找,否則在右子樹中尋找
         } //endwhile
        p=(BSTNode *)malloc(sizeof(BSTNode));
        p->key=key; p->lchild=p->rchild=NULL; //產生新結點
        if(*TPtr==NULL) //原樹為空白
           *Tptr=p; //新插入的結點為新的根
        else //原樹非空時將新結點關p作為關f的左孩子或右孩子插入
          if(key<f->key)
            f->lchild=p;
          else f->rchild=p;
       } //InsertBST

④二叉排序樹的產生
  二叉排序樹的產生,是從空的二叉排序樹開始,每輸入一個結點資料,就調用一次插入演算法將它插入到當前已產生的二叉排序樹中。產生二叉排序樹的演算法如下:
  BSTree CreateBST(void)
   { //輸入一個結點序列,建立一棵二叉排序樹,將根結點指標返回
    BSTree T=NULL; //初始時T為空白樹
    KeyType key;
    scanf("%d",&key); //讀人一個關鍵字
    while(key){ //假設key=0是輸人結束標誌
      InsertBST(&T,key); //將key插入二叉排序樹T
      scanf("%d",&key);//讀人下一關鍵字
     }
    return T; //返回建立的二叉排序樹的根指標
   } //BSTree

⑤二叉排序樹的產生過程
  由輸入執行個體(5,3,7,2,4,8),根據產生二叉排序樹演算法產生二叉排序樹的過程【參見動畫示範】
  注意:
   輸入序列決定了二叉排序樹的形態。
  二叉排序樹的中序序列是一個有序序列。所以對於一個任意的關鍵字序列構造一棵二叉排序樹,其實質是對此關鍵字序列進行排序,使其變為有序序列。"排序樹"的名稱也由此而來。通常將這種排序稱為樹排序(Tree Sort),可以證明這種排序的平均執行時間亦為O(nlgn)。
  對相同的輸入執行個體,樹排序的執行時間約為堆排序的2至3倍。因此在一般情況下,構造二叉排序樹的目的並非為了排序,而是用它來加速尋找,這是因為在一個有序的集合上尋找通常比在無序集合上尋找更快。因此,人們又常常將二叉排序樹稱為二叉尋找樹。

二叉排序樹(二叉尋找樹)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.