二叉搜尋樹的插入 刪除與遍歷

2021-07-30 10:50:37 字數 2147 閱讀 6413

二叉搜尋樹是有序的,插入之後要使插入後的樹還是有序的,就必須比較每個節點的值,然後再選擇合適的位置插入,首先先將樹的節點設計如下:

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 總結 二叉樹的插入比較好解決,只需要簡單的遞迴判斷即可。麻煩一點的是二叉樹的...

二叉搜尋樹的插入與刪除

題目 建立乙個類,類中的資料成員時一棵二叉搜尋樹,對外提供的介面有新增結點和刪除結點這兩種方法。使用者不關注二叉樹的情況。要求我們給出這個類的結構以及實現類中的方法。刪除結點比較麻煩,因為需要調整樹的結構,這是因為刪除結點並不一定發生在葉子結點。如果刪除的是葉子結點,那麼操作非常簡單,只是做相應的刪...

二叉搜尋樹的插入與刪除

題目 建立乙個類,類中的資料成員時一棵二叉搜尋樹,對外提供的介面有新增結點和刪除結點這兩種方法。使用者不關注二叉樹的情況。要求我們給出這個類的結構以及實現類中的方法。刪除結點比較麻煩,因為需要調整樹的結構,這是因為刪除結點並不一定發生在葉子結點。如果刪除的是葉子結點,那麼操作非常簡單,只是做相應的刪...