二叉搜尋樹是有序的,插入之後要使插入後的樹還是有序的,就必須比較每個節點的值,然後再選擇合適的位置插入,首先先將樹的節點設計如下:
typedef
int elemtype;
typedef
struct _bstnode
bstnode;
插入的方式實現了兩種,一種是遞迴方式,一種是非遞迴實現。
非遞迴:
購買節點:
bstnode * buynode()
```
bool
insert(bstnode*&root, elemtype e)
bstnode* p = root;
bstnode*s = null;
while (p != null&&p->data != e)
node->parent = s;
if (s->data > e)
s->leftchild = node;
else
s->rightchild = node;
return true;
}
遞迴實現:
bool insert_e(bstnode*&root, elemtype e,bstnode*s)//利用遞迴實現插入
else
if (root->
data
== e)
return
false;
return root->
data
> e ? insert_e(root->leftchild, e,root) : insert_e(root->rightchild, e,root);
}
二叉搜尋樹的刪除分為六種情況:
1、向空樹中刪除節點。
2、刪除的節點沒有找到。
3、刪除的節點為葉子節點。
4、刪除的節點為單分支節點。
5、刪除的節點為單分支根節點。
6、刪除的節點為雙分支節點。
非遞迴實現:
bool remove(bstnode*&root, elemtype e)
bstnode*child = p->leftchild;
if (child ==
null)
child = p->rightchild;
bstnode*pa = p->
parent;
if (pa ==
null)
root = child;
else
if (child !=
null)
child->
parent
= pa;
free(p);
return
true;
}
遞迴實現:
bool remove_ex(bstnode*
&root, elemtype e)
bstnode*p = root->leftchild ==
null
? root->rightchild : root->leftchild;
if (p !=
null)
p->
parent
= root->
parent;
free(root);
root = p;
return
true;
}}
static bstnode*first(bstnode*p)
return p;
}static bstnode*next(bstnode*p)//這裡根據中序遍歷的特點實現,還可以根據二叉排序樹的值得大小進行遍歷
return pa;
}void inoder_e(bstnode*root)
cout << endl;
}
二叉搜尋樹的插入與刪除
插入 bstree insert bstree bst,elementtype x else return bst 刪除 bstree delete bstree bst,element x else return bst 總結 二叉樹的插入比較好解決,只需要簡單的遞迴判斷即可。麻煩一點的是二叉樹的...
二叉搜尋樹的插入與刪除
題目 建立乙個類,類中的資料成員時一棵二叉搜尋樹,對外提供的介面有新增結點和刪除結點這兩種方法。使用者不關注二叉樹的情況。要求我們給出這個類的結構以及實現類中的方法。刪除結點比較麻煩,因為需要調整樹的結構,這是因為刪除結點並不一定發生在葉子結點。如果刪除的是葉子結點,那麼操作非常簡單,只是做相應的刪...
二叉搜尋樹的插入與刪除
題目 建立乙個類,類中的資料成員時一棵二叉搜尋樹,對外提供的介面有新增結點和刪除結點這兩種方法。使用者不關注二叉樹的情況。要求我們給出這個類的結構以及實現類中的方法。刪除結點比較麻煩,因為需要調整樹的結構,這是因為刪除結點並不一定發生在葉子結點。如果刪除的是葉子結點,那麼操作非常簡單,只是做相應的刪...