二叉搜尋樹又稱二叉排序樹,它或者是一顆空樹,或者是具有以下性質的二叉樹
·若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值
·若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值
·它的左右子樹也分別為二叉搜尋樹,
//插入
int bstreeinsert(bstreenode** tree, bstdatatype x);
//遞迴插入
int bstreeinsert_r(bstreenode** tree, bstdatatype x);
//刪除
int bstreeremove(bstreenode** tree, bstdatatype x);
//遞迴刪除
int bstreeremove_r(bstreenode** tree, bstdatatype x);
//查詢
bstreenode* bstreefind(bstreenode** tree, bstdatatype x);
//遞迴查詢
bstreenode* bstreefind_r(bstreenode** tree, bstdatatype x);
//中序遍歷
void bstreeinorder(bstreenode** tree);
binarysearchtree.c
#include"binarysearchtree.h"
//申請節點
bstreenode * buybstreenode(bstdatatype x)
//插入
int bstreeinsert(bstreenode** tree, bstdatatype x)
root = *tree;
cur = root;
while (root)
else if (root->_data < x)
else
}if (cur->_data>x)
cur->_left = buybstreenode(x);
else
cur->_right = buybstreenode(x);
return 1;
}//遞迴插入
int bstreeinsert_r(bstreenode** tree, bstdatatype x)
if ((*tree)->_data > x)
return bstreeinsert_r(&(*tree)->_left, x);
else if ((*tree)->_data < x)
return bstreeinsert_r(&(*tree)->_right, x);
else
return 0;
}//刪除
int bstreeremove(bstreenode** tree, bstdatatype x)
else if (cur->_data < x)
else
if (parent->_left == cur)
else
}//左右都不為空
else
}} if (cur == null)
return 0;
free(cur);
cur = null;
return 1;
}//遞迴刪除
int bstreeremove_r(bstreenode** tree, bstdatatype x)
free(cur);
cur = null;
return 1;
} else if (cur->_data > x)
return bstreeremove_r(&cur->_left, x);
else
return bstreeremove_r(&cur->_right, x);
return 0;
}//查詢
bstreenode* bstreefind(bstreenode** tree, bstdatatype x)
return null;
}//遞迴查詢
bstreenode* bstreefind_r(bstreenode** tree, bstdatatype x)
//中序遍歷
void bstreeinorder(bstreenode** tree)
test.c
#include"binarysearchtree.h"
void testbstree()
; bstreenode* tree = null;
for (int i = 0; i < sizeof(a)/sizeof(a[0]); ++i)
bstreeinorder(&tree);
printf("\n");
bstreeremove(&tree, 4);
bstreeremove(&tree, 8);
bstreeremove(&tree, 3);
bstreeremove(&tree, 7);
bstreeremove(&tree, 5);
bstreeinorder(&tree);
printf("\n");
bstreeremove(&tree, 0);
bstreeremove(&tree, 1);
bstreeremove(&tree, 2);
bstreeremove(&tree, 3);
bstreeremove(&tree, 4);
bstreeremove(&tree, 5);
bstreeremove(&tree, 6);
bstreeremove(&tree, 7);
bstreeremove(&tree, 8);
bstreeremove(&tree, 9);
bstreeinorder(&tree);
printf("\n");
} int main()
資料結構與演算法 資料結構C 堆
資料結構c 堆 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i 2 ki k2 i 1 且 ki k2 i 2 i 0,1,2 則稱為小堆 或大堆 小堆 大堆 中 任一結點的關鍵碼均小於 大於 等於它的左右孩子的...
資料結構與演算法 資料結構之棧
棧的英文名是stack 棧的應用場景 表示式的轉換 中綴表示式轉字尾表示式 與求值 實際解決 二叉樹的遍歷。圖形的深度優先 depth一first 搜尋法。package org.yc public class test class arraystack boolean isfull return ...
資料演算法 資料結構與演算法
資料結構和演算法的意義?資料結構是資料的組織方式,演算法是對資料的處理方式,合理的資料結構和演算法,能夠保證程式高效的執行。演算法的五大特性 輸入 演算法具有0個或多個輸入 輸出 演算法具有1個或多個輸出 確定性 演算法每一步有確定的含義,不能有二義性 可行性 演算法有限次完成 演算法的評價方式?演...