二叉排序樹

2021-08-03 07:01:21 字數 1750 閱讀 4639

二叉排序樹(bst)

建立在二叉樹基礎上,性質如下

查詢,近乎析半查詢,輸出採用中序遍歷,可獲取從大到小序列

構造一顆二叉排序樹的目的,其實並不是為了排序,而是為了提高查詢和插入刪除關鍵字的速度。

**示例:

建立:輸入前序排列的陣列

pnode creatree(pnode *tr,int a)

}

插入:

int inserttr(pnode *tr,int a)//注意形參為指標的指標,若pnode tr的話無法傳回tre

else

else if((*tr)->inode

right,a);}}

return 1;

}

該節點若是空,插入即可,

非空,小於該節點值,再插入左子樹,否則,插入右子樹,等於該節點值,則不執行;並不會引起二叉樹其他部分的結構變化

查詢:

pnode* findq(pnode *tr,int a)//查詢不成功返回-1;其他返回1;

else if((*tr)->inode==a)

return tr;

else

else}}

該節點若是空,返回,

非空,小於該節點值,入左子樹查詢,大於該節點,入右子樹查詢,等於該節點,即找到

刪除:**塊一直顯示empty,不知為啥,只有直接貼出來了;此**驗證無誤,有許多部落格寫的不全面或是錯的

int deletetr(pnode *tr,int a)

(*c)->inode=(s)->inode;//交換被刪除節點與最右節點的值,子樹指標保留,這樣操作比較方便

//最右節點可能存在左子樹,將其保留,但注意:

if(q==(*c))//此時,新節點就是被刪除節點的左子樹根

q->left=s->left;

else

q->right=s->left;

delete s;

}else if(((*c)->left==null)&&((*c)->right==null))

else

else

}return 1;

}

葉子節點直接刪除;

有乙個子樹上移連線即可;

兩個子樹,兩種方法

1.用被刪結點左子樹最右下的結點的值代替被刪結點的值,然後刪去最右下的結點,即直接前驅

2.用被刪結點右子樹最左下的結點的值代替被刪結點的值,然後刪去最左下的結點,即

直接後繼

為啥可以這樣?直接前驅或者直接後繼,就是數值上最貼近被替換節點的值,故直接替換值即可,被替換節點的左右子樹指標不變,注意指標操作

我們採用方法1

主函式:中序遍歷函式參見二叉樹內容

typedef struct nodenode ,*pnode;

int main()

; pnode tre;

creatree(&tre,a);//前序排列初始化乙個樹;%表示無節點

midout(tre);//

cout<

結果:

二叉排序樹

在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...

二叉排序樹

name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...

二叉排序樹

include include include include struct tree node void insert node struct tree node int void pre order struct tree node void in order struct tree node ...