查詢 二叉查詢樹

2021-09-11 18:12:20 字數 3372 閱讀 2462

原始碼:

目錄:順序查詢

二分查詢

插值查詢

斐波那契查詢

分塊查詢

雜湊查詢

二叉樹查詢

紅黑樹查詢

二叉查詢樹又稱二叉排序樹又稱二叉搜尋樹,如不為空則有以下性質:

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 ...