java程序二叉树_Java实现简单二叉树
B樹(shù)
即二叉搜索樹(shù):
1.所有非葉子結(jié)點(diǎn)至多擁有兩個(gè)兒子(Left和Right);
2.所有結(jié)點(diǎn)存儲(chǔ)一個(gè)關(guān)鍵字;
3.非葉子結(jié)點(diǎn)的左指針指向小于其關(guān)鍵字的子樹(shù),右指針指向大于其關(guān)鍵字的子樹(shù);
如:
B樹(shù)的搜索,從根結(jié)點(diǎn)開(kāi)始,如果查詢(xún)的關(guān)鍵字與結(jié)點(diǎn)的關(guān)鍵字相等,那么就命中;
否則,如果查詢(xún)關(guān)鍵字比結(jié)點(diǎn)關(guān)鍵字小,就進(jìn)入左兒子;如果比結(jié)點(diǎn)關(guān)鍵字大,就進(jìn)入
右兒子;如果左兒子或右兒子的指針為空,則報(bào)告找不到相應(yīng)的關(guān)鍵字;
如果B樹(shù)的所有非葉子結(jié)點(diǎn)的左右子樹(shù)的結(jié)點(diǎn)數(shù)目均保持差不多(平衡),那么B樹(shù)
的搜索性能逼近二分查找;但它比連續(xù)內(nèi)存空間的二分查找的優(yōu)點(diǎn)是,改變B樹(shù)結(jié)構(gòu)
(插入與刪除結(jié)點(diǎn))不需要移動(dòng)大段的內(nèi)存數(shù)據(jù),甚至通常是常數(shù)開(kāi)銷(xiāo);
如:
但B樹(shù)在經(jīng)過(guò)多次插入與刪除后,有可能導(dǎo)致不同的結(jié)構(gòu):
右邊也是一個(gè)B樹(shù),但它的搜索性能已經(jīng)是線(xiàn)性的了;同樣的關(guān)鍵字集合有可能導(dǎo)致不同的
樹(shù)結(jié)構(gòu)索引;所以,使用B樹(shù)還要考慮盡可能讓B樹(shù)保持左圖的結(jié)構(gòu),和避免右圖的結(jié)構(gòu),也就
是所謂的“平衡”問(wèn)題;
實(shí)際使用的B樹(shù)都是在原B樹(shù)的基礎(chǔ)上加上平衡算法,即“平衡二叉樹(shù)”;如何保持B樹(shù)
結(jié)點(diǎn)分布均勻的平衡算法是平衡二叉樹(shù)的關(guān)鍵;平衡算法是一種在B樹(shù)中插入和刪除結(jié)點(diǎn)的
策略;
public class NodeTree {
int data; //根節(jié)點(diǎn)數(shù)據(jù)
NodeTree left; //左子樹(shù)
NodeTree right; //右子樹(shù)
public NodeTree() {
super();
}
public NodeTree(int data) { //實(shí)例化二叉樹(shù)
super();
this.data = data;
left=null;
right=null;
}
public void insert(NodeTree root,int data){
if(data>root.data){ //如果插入的節(jié)點(diǎn)大于跟節(jié)點(diǎn)
if(root.right==null){//如果右子樹(shù)為空,就插入,如果不為空就再創(chuàng)建一個(gè)節(jié)點(diǎn)
root.right=new NodeTree(data); //就把插入的節(jié)點(diǎn)放在右邊
}else{
this.insert(root.right, data);
}
}else{ //如果插入的節(jié)點(diǎn)小于根節(jié)點(diǎn)
if(root.left==null){ //如果左子樹(shù)為空,就插入,如果不為空就再創(chuàng)建一個(gè)節(jié)點(diǎn)
root.left=new NodeTree(data); //就把插入的節(jié)點(diǎn)放在左邊邊
}else{
this.insert(root.left, data);
}
}
}
}
public class NodeQuery {
public static void preOrder(NodeTree root) { // 先根遍歷
if (root != null) {
System.out.print(root.data + "-");
preOrder(root.left);
preOrder(root.right);
}
}
public static void inOrder(NodeTree root) { // 中根遍歷
if (root != null) {
inOrder(root.left);
System.out.print(root.data + "--");
inOrder(root.right);
}
}
public static void postOrder(NodeTree root) { // 后根遍歷
if (root != null) {
postOrder(root.left);
postOrder(root.right);
System.out.print(root.data + "---");
}
}
public static void main(String[] args) {
int[] array = {35,17,39,9,28,65,56,87};
NodeTree root = new NodeTree(array[0]); //創(chuàng)建二叉樹(shù)
for(int i=1;i
root.insert(root, array[i]); //向二叉樹(shù)中插入數(shù)據(jù)
}
System.out.println("先根遍歷:");
preOrder(root);
/* System.out.println();
System.out.println("中根遍歷:");
inOrder(root);
System.out.println();
System.out.println("后根遍歷:");
postOrder(root);*/
}
} 上面這個(gè)樹(shù)的實(shí)現(xiàn),應(yīng)該是最經(jīng)典最簡(jiǎn)單的了吧;
總結(jié)
以上是生活随笔為你收集整理的java程序二叉树_Java实现简单二叉树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql truncate drop_
- 下一篇: Java char所占用的字节_关于un