二叉排序樹(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 ...