又稱二叉排序樹,它或者是一顆空樹
若他的左子樹不為空,則左子樹所有節點的值小於根節點的值
若他的右子樹不為空,則有字數上所有節點都小於根節點的值
它的左右子樹也分別為二叉搜尋樹
用來進行搜尋
進行中序遍歷,可以得到乙個有序的序列
樹中最左側節點一定是最小的節點,最右側節點一定是最大的
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 前驅結點 ...