提到動態的話,就要想到鍊錶了,所以這一次主要是總結,在鍊錶上如何實現查詢。
若樹的左子樹不為空,那麼左子樹上所有節點的值均小它的根節點的值。若他的右子樹不為空,那麼右子樹上所有節點的值,均大於他的根節點的值。這個定義,感覺上其實是跟堆基本上沒有差別,可以學完二叉排序樹之後再去學下堆。
pnode search(bittree t, int key)
二叉排序樹的結構不是一次生成的,而是在查詢過程中,如果發現不存在於二叉排序樹中,則進行插入操作,那麼仿照上面的搜尋演算法,我們可以採用下面的方法來實現二叉樹的插入
struct node
node,*pnode;
pnode search(pnode t, int key,pnode p,pnode &f)
if (key == t.data)
else if(key>t.data)
else if(keylchild, key,t,f); }}
pnode insert(bittree t,int key)
else
return true;
} return false;
}
將乙個節點從二叉排序樹中刪除,總共有三種情況
1.被刪除節點為葉子節點,左右子樹為空,那麼直接刪除即可1.2的實現,都比較簡單,我們主要來看第三種情況的具體實現。先進行分析。2.被刪除節點只有左子樹,或者右子樹那麼直接令,子樹成為其前繼節點的子樹即可。
3.被刪除節點既有左子樹,又有右子樹的情況
所以上面的設想是不靠譜的,是極不科學的。當我們建立好二叉排序樹之後,我們可以按照二叉樹的中序遍歷來得到乙個有序序列。我們只需要保證刪除完節點後二叉排序的樹中序遍歷得到的有序序列變化不大即可。但實現起來較為麻煩我們採用另一種方法。將被刪除節點的右子樹接在左子樹最右邊的右子樹上,被刪除的節點用被刪除節點的左子樹替代
#include #include typedef struct node
node,*pnode;
void delete_t(pnode &p,pnode &fp)
if (!p->lchild)
else if(!p->rchild)
else
t->rchild = p->rchild;
q = q->lchild;
free(p);
} return;
}pnode search(pnode t, int key, pnode p, pnode &f,pnode &father_of_pnew)
if (key == t->data)
else if (key > t->data)
else if (key < t->data) }
bool insert(pnode t, int key)
else
return true;
} return false;
}void init(pnode &t)
}void visit(pnode t)
int main()
完整**如上,另外需要注意的是,千萬不要按照書上的那個刪除節點來寫,卡了半天,orz.刪除節點的正確操作時,找到父親節點,然後讓父親節點指向被刪節點的下乙個節點,再free被刪除的節點。千萬!千萬!千萬!不要按照課本上的去實現!!! 資料結構 查詢總結
1.靜態查詢表與動態查詢表的區別 是否需要動態地插入或刪除。2.適合靜態查詢表的查詢方法 順序查詢 折半查詢 雜湊查詢等。適合動態查詢的查詢方法 二叉排序樹的查詢 雜湊查詢等。3.順序查詢缺點 當n較大時,平均查詢長度較大,效率低 優點是對資料元素的儲存沒有要求,順序儲存或鏈式儲存皆可。4.順序查詢...
資料結構之(三)之陣列篇
設計乙個演算法,將一維陣列a 下標從1開始 中的元素迴圈右移k位,要求 只用乙個元素大小的附加儲存空間。給出演算法的時間複雜度。includeint cir int a,int n,int k 陣列a,陣列的 個數,迴圈的位數 a 0 t int main cir a,9,5 for int i 0...
考研系列之三 資料結構雜集
1.線性表順序表倒置演算法 int len strlen l int i 0 while iint tmp l i l i l len i 1 l len i 1 tmp 2.畫二叉排序樹 每次與子樹根節點比較,從而向下左右選擇移動,左小右大。中序遍歷可得到有序序列。3.線索二叉樹 1 擴充套件結點...