原始碼:
目錄:順序查詢
二分查詢
插值查詢
斐波那契查詢
分塊查詢
雜湊查詢
二叉樹查詢
紅黑樹查詢
二叉查詢樹又稱二叉排序樹又稱二叉搜尋樹,如不為空則有以下性質:
1. 若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
2. 若任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
3. 任意節點的左、右子樹也分別為二叉查詢樹。
這裡有個比較好的**,可以自己手動增刪查進行操作,觀察動畫方便理解
如下圖:
從根節點開始比較,如果大於該節點則到右子節點比較,否則到左子節點比較,直到碰到節點為空時,將要增加的節點賦值到空節點上,對於相等時的處理,可以直接插入到右側或左側的節點上。或者可以採用遞迴來實現。
/**
*向二叉搜尋樹中增加乙個元素
* @param value
* @return
*/public boolean put(int value)
binarysorttree tree = this;
while (true)
tree = tree.rightnode;
}else if(value < tree.value)
tree = tree.leftnode;
}else
}return true;
}
查詢是比較方便的,不斷和節點值比較,大於節點值就到右子樹比較,小於節點值就到左子樹比較,直到相等即可結束
/**
* 查詢第乙個出現該值的節點
* @param value
* @return
*/public binarysorttree get(int value)
while (tree != null) else if (tree.value > value) else
}return null;
}
刪除節點主要分為三種情況,
1.節點無子節點,直接刪除即可
2.節點有乙個子節點,子節點上提即可
3.節點有兩個子節點,可隨意上提乙個子樹,如上提的是左子樹(右子樹),並將另一側節點放到上提的子樹中最大節點(最小節點)的右節點(左節點)上
/**
* 刪除第乙個節點的值是該值的節點
* @param value
* @return
*/public boolean remove(int value)
binarysorttree tree = this;
while (tree != null) else if (tree.value < value)else
}return false;
}private void remove(binarysorttree tree)else if (tree.parentnode.leftnode == tree)else
}else if (tree.leftnode == null)else if (tree.parentnode.leftnode == tree)else
}else if (tree.rightnode == null)else if (tree.parentnode.leftnode == tree)else
}else
leftnodetreemaxnode.rightnode = tree.rightnode;
tree.value = tree.leftnode.value;
tree.rightnode = tree.leftnode.rightnode;
tree.leftnode = tree.leftnode.leftnode;
}else if (tree.parentnode.leftnode == tree)
leftnodetreemaxnode.rightnode = tree.rightnode;
}else
leftnodetreemaxnode.rightnode = tree.rightnode;}}
}
直接上**
/********三種遍歷************
* a
* / \
* b e
* \ \
* c f
* / /
* d g
* /\
* h k
** 前序遍歷(根左右): abcdefghk
* 中序遍歷(左根右): bdcaehgkf
* 後序遍歷(左右根): dcbhkgfea
** */
/*** 後序遍歷,最後乙個一定是根節點
* @return
*/public listenditeration()
private void endrecursion(binarysorttree tree,listlist)
endrecursion(tree.leftnode, list);
endrecursion(tree.rightnode, list);
list.add(tree.value);
}/**
* 中序遍歷,第乙個是最小值,最後乙個是最大值
* @return
*/public listmiddleiteration()
private void middlerecursion(binarysorttree tree,listlist)
middlerecursion(tree.leftnode, list);
list.add(tree.value);
middlerecursion(tree.rightnode, list);
}/**
* 前序遍歷,第乙個一定是根節點
* @return
*/public listbeforeiteration()
private void beforerecursion(binarysorttree tree,listlist)
list.add(tree.value);
beforerecursion(tree.leftnode, list);
beforerecursion(tree.rightnode, list);
}
查詢樹ADT 二叉查詢樹
二叉樹的乙個重要應用是它們在查詢中的使用。二叉查詢樹的性質 對於樹中的每個節點x,它的左子樹中所有項的值小於x中的項,而它的右子樹中所有項的值大於x中的項。這意味著該樹所有的元素可以用某種一致的方式排序。二叉查詢樹的平均深度是o logn 二叉查詢樹要求所有的項都能夠排序。樹中的兩項總可以使用com...
二叉查詢樹
二叉查詢的中序遍歷是乙個有序序列,由於插入與修改都相當簡單,這裡不說了,說一下二叉查詢樹的刪除 刪除結點有三種情況,刪除的結點為p 1.p沒有子結點 2.p有乙個子結點 3.p有兩個子結點 在上面 1.2 兩種情況下的刪除都很簡單,也不多說,只說一下第三種情況 上面說過,二叉樹的中序遍歷是乙個有序序...
二叉查詢樹
二叉查詢樹 t 節點元素型別 public class binarysearchtree binarynode t element,binarynodeleft,binarynoderight 根 private binarynoderoot 插入 public void insert t ele ...