本帖部分文字和來自於
但所有**均為原創
二叉查詢樹(英語:binary search tree),也稱二叉搜尋樹、有序二叉樹(英語:ordered binary tree),排序二叉樹(英語:sorted binary tree),是指一棵空樹或者具有下列性質的二叉樹:二叉查詢樹相比於其他資料結構的優勢在於查詢、插入的時間複雜度較低,為o(log n)。二叉查詢樹是基礎性資料結構,用於構建更為抽象的資料結構,如集合、multiset、關聯陣列等。
如何新增元素到二叉查詢樹中呢?
首先定義二叉查詢樹類
然後定義add方法public
class binarysearchtreenode
}
列印整個二叉查詢樹:public binarysearchtreenode add(int
value, binarysearchtreenode node)else else
}
最後我們執行下面的**進行測試:public void printbst(binarysearchtreenode node)
if(node.right != null)
}
以下是輸出內容:int values = ;
binarysearchtreenode root = null;
for(int i=0; i
printbst(root);
node = 20, node.parent = null, left=15, right=25生成二叉查詢樹的問題解決了,那麼如何查詢呢node = 15, node.parent = 20, left=10, right=18
node = 10, node.parent = 15, left=null, right=12
node = 12, node.parent = 10, left=null, right=null
node = 18, node.parent = 15, left=null, right=null
node = 25, node.parent = 20, left=null, right=30
node = 30, node.parent = 25, left=null, right=null
- 若b是空樹,則搜尋失敗,否則:
- 若x等於b的根節點的資料域之值,則查詢成功;否則:
- 若x小於b的根節點的資料域之值,則搜尋左子樹;否則:
- 查詢右子樹。
public binarysearchtreenode search(binarysearchtreenode node, int
value)else
if (value
< node.value) else
}else
}
system.out.println(「search 18 = 」 + (search(root, 18)==null?」failure」:」success」));刪除是最複雜的,主要考慮兩種情況system.out.println(「search 22 = 」 + (search(root, 22)==null?」failure」:」success」));
輸出結果:
search 18 = success
search 22 = failure
單孩子的情況
這個比較簡單,如果刪除的節點有左孩子那就把左孩子頂上去,如果有右孩子就把右孩子頂上去,結束。
左右都有孩子的情況
首先可以這麼想象,如果我們要刪除乙個陣列的元素,那麼我們在刪除後會將其後面的乙個元素頂到被刪除的位置,如圖
那麼二叉樹操作同樣也是一樣,我們根據」中序遍歷「找到要刪除結點的後乙個結點,然後頂上去就行了,原理跟」陣列」一樣一樣的。
**如下:
以下是測試**:public binarysearchtreenode delete(binarysearchtreenode node) else
if (node.parent.left != null && node.parent.left.value == node.value) else
if (node.parent.right != null && node.parent.right.value == node.value)
return node.parent;
} else
if (node.left != null && node.right != null) else else
if (node.parent.right != null && node.parent.right.value == node.value)
node = n;}}
return node;
}
system.out.println("it will delete 15");
binarysearchtreenode deletenode15 = search(root, 15);
if(deletenode15 != null && deletenode15.parent != null) else
printbst(root);
it will delete 15delete 15 = success
node = 20, node.parent = null, left=18, right=25
node = 18, node.parent = 20, left=10, right=null
node = 10, node.parent = 18, left=null, right=12
node = 12, node.parent = 10, left=null, right=null
node = 25, node.parent = 20, left=null, right=30
node = 30, node.parent = 25, left=null, right=null
二叉樹 二叉查詢樹
構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...
二叉樹 二叉查詢樹
二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...
樹(樹,二叉樹,二叉查詢樹)
1.定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹 2.對於任一棵非空樹 n 0 它具備以下性質 1 樹中有乙個稱為 根 root 的特殊結點,用 r 表示 2 其餘結點可分為m m 0 個互不相交的有限集t1,t2,其中每個集合本身又是一棵樹,稱為原來樹的子樹。3.樹的一些性質 1 ...