二叉搜尋樹性質及插入,刪除,是否存在

2021-10-05 08:17:43 字數 2738 閱讀 2598

又稱二叉排序樹,它或者是一顆空樹

若他的左子樹不為空,則左子樹所有節點的值小於根節點的值

若他的右子樹不為空,則有字數上所有節點都小於根節點的值

它的左右子樹也分別為二叉搜尋樹

用來進行搜尋

進行中序遍歷,可以得到乙個有序的序列

樹中最左側節點一定是最小的節點,最右側節點一定是最大的

static class bstnode

}

1.插入

boolean put(int key)

//找到待插入節點在搜尋樹中的位置

bstnode cur=root;

bstnode parent=null;

while (cur != null)

else if (key >cur.value)

else

} //插入節點

cur = new bstnode

(key)

; if (cur.value > parent.value)

else

return true;

}

2.刪除

1. 待刪除節點的左右孩子都不存在

2.待刪除節點的左孩子存在

3.待刪除節點的右孩子存在

1.2.3可以直接刪除,將parent或者root的指向修改

沒有雙親

有雙親,雙親的右孩子

有雙親,雙親的左孩子

4. 待刪除節點的左右孩子都存在

4.不能直接刪除,在其子節點中找到乙個替代的節點,將該替代節點的值域交給待刪除節點,去刪除替代節點

替代節點:待刪除節點的左子樹中的最大節點 帶刪除節點的右子樹中的最小節點

//替代節點找到

cur.value=del.value;

//刪除替代節點

if(del==parent.left)

else

}}3.搜尋

時間複雜度:o(n)

如果使用者給的數有序,或者接近有序:時間複雜度:o(n),因為已經退化為單枝樹

boolean contains(int key)

else if(cur.value

else

} return false;

}

4.最大節點

public   int    maxmostnode()

return cur.value;

}

5.最小節點

public   int   smallmostnode()

return cur.value;

}

6.二叉搜尋樹轉化為有序的雙向鍊錶

雙向鍊錶:prev指向前乙個節點 next指向後乙個節點

按照中序遍歷的規則來改變left和right的指向,left指向小的節點,right指向大的節點

1.找鍊錶的首節點,也就是樹中最小的節點----》最左端節點

2.按照中序遍歷的規則來修改左右孩子的指向

每拿到乙個節點,只修該當前節點的左指標域,因為按照中序遍歷的規則,肯定知道當前節點的前乙個節點是那個節點(因為其前乙個節點剛剛遍歷過),當前節點的後續還沒有遍歷

測試用例:

public class test

; bstree bstree=new bstree()

; for(int e:array)

// bstree.inordertree()

; system.out.println

(bstree.contains

(7))

; system.out.println

(bstree.maxmostnode()

);system.out.println

(bstree.smallmostnode()

);bstree.delete

(6);

bstree.inordertree();}}

搜尋二叉樹 插入 刪除)

1.1搜尋二叉樹的概念 二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有一下性質的樹 1.2二叉搜尋樹操作 1.二叉搜尋樹的查詢 若根節點不為空 否則,返回false node find const k key else if cur kv.first kv.first else return...

二叉搜尋樹的插入 刪除

二叉搜尋樹 就是每乙個結點的data值,都大於它的所有左孩子的data,小於所有右孩子的data 二叉搜尋樹的插入刪除的模擬 pragma once namespace ljc template class t friend class binarysorttree template class t...

二叉搜尋樹的搜尋 插入 後繼 刪除

二叉搜尋樹 二叉搜尋樹是以二叉樹是形式表示的,這樣就可以使用乙個二叉鍊錶來表示二叉搜尋樹了。對於任何結點x,其左子樹的關鍵字的值不大於x.key,右子樹的關鍵字不小於x.key。二叉搜尋樹支援insert delete search maximum minimum predecessor 前驅結點 ...