java實現二叉搜索樹及二叉樹測試
二叉樹相關知識:
二叉樹是每個節點都不能有多於兩個兒子的樹
二叉樹的一個性質是一顆平均二叉樹的深度要比節點數N小得多
二叉樹的平均深度爲O(N \sqrt N N )
二叉查找樹的平均深度爲O(log N \log N log N )
關於刪除節點 :
a. 若刪除的節點是葉節點則直接刪除
b. 若刪除的是有兩個兒子的節點則先用被刪除節點的右子樹的最小值覆蓋被刪除節點的值,之後珊瑚這個右子樹最小值節點【這個節點一定沒有左子樹,所以遞歸到此處直接執行c情況】
c. 若刪除的是有一個兒子的節點則直接改變該節點的父節點的指向即可。
d. 懶惰刪除:當一個節點要被刪除的時候依舊將其留在樹中,只是被標記爲被刪除。
實現代碼:
package tree;
public class MyBinaryTree < nodeType extends Comparable < ? super nodeType>> {
private BinaryNode< nodeType> mroot;
public void setMroot ( nodeType x) {
mroot = new BinaryNode < > ( x) ;
}
public void makeEmpty ( ) {
mroot = null;
}
public void BinarySearchTree ( ) {
this . mroot = null;
}
public boolean isEmpty ( ) {
return mroot == null;
}
public static class BinaryNode < nodeType> {
nodeType element;
BinaryNode left;
BinaryNode right;
public BinaryNode ( nodeType element, BinaryNode left, BinaryNode right) {
this . element = element;
this . left = left;
this . right = right;
}
public BinaryNode ( nodeType element) {
this ( element, null, null) ;
}
}
public void preoder ( BinaryNode< nodeType> root) {
if ( root != null) {
System. out. print ( root. element + "\t" ) ;
preoder ( root. left) ;
preoder ( root. right) ;
}
}
public void preorder ( ) {
preoder ( mroot) ;
}
public void inorder ( BinaryNode< nodeType> root) {
if ( root != null) {
inorder ( root. left) ;
System. out. print ( root. element + "\t" ) ;
inorder ( root. right) ;
}
}
public void inorder ( ) {
inorder ( mroot) ;
}
public void postorder ( BinaryNode< nodeType> root) {
if ( root != null) {
postorder ( root. left) ;
postorder ( root. right) ;
System. out. print ( root. element + "\t" ) ;
}
}
public void postorder ( ) {
postorder ( mroot) ;
}
public boolean contains ( nodeType x, BinaryNode< nodeType> node) {
while ( true ) {
if ( node == null) return false ;
if ( x. compareTo ( node. element) < 0 )
node = node. left;
else if ( x. compareTo ( node. element) > 0 )
node = node. right;
else
return true ;
}
}
public boolean contains ( nodeType x) {
return contains ( x, mroot) ;
}
public BinaryNode findMin ( BinaryNode< nodeType> node) {
if ( node == null) return null;
if ( node. left == null) return node;
return findMin ( node. left) ;
}
public nodeType findMin ( ) {
return ( nodeType) findMin ( mroot) . element;
}
public BinaryNode findMax ( BinaryNode< nodeType> node) {
while ( true ) {
if ( node == null)
return null;
if ( node. right == null)
return node;
else node = node. right;
}
}
public nodeType findMax ( ) {
return ( nodeType) findMax ( mroot) . element;
}
public BinaryNode< nodeType> insertNode ( nodeType x, BinaryNode< nodeType> root) {
if ( root == null)
return new BinaryNode < nodeType> ( x) ;
if ( x. compareTo ( root. element) < 0 )
root. left = insertNode ( x, root. left) ;
else if ( x. compareTo ( root. element) > 0 )
root. right = insertNode ( x, root. right) ;
else
;
return root;
}
public void insertNode ( nodeType x) {
insertNode ( x, mroot) ;
}
public BinaryNode removeNode ( nodeType x, BinaryNode< nodeType> root) {
if ( root == null)
return root;
if ( root. element. compareTo ( x) < 0 )
root. right = removeNode ( x, root. right) ;
else if ( root. element. compareTo ( x) > 0 )
root. left = removeNode ( x, root. left) ;
else if ( root. right != null && root. left != null) {
root. element = ( nodeType) findMin ( root. right) . element;
root. right = removeNode ( root. element, root. right) ;
} else {
root = ( root. left == null) ? root. right : root. left;
}
return root;
}
public nodeType removeNode ( nodeType x) {
return ( nodeType) removeNode ( x, mroot) . element;
}
}
測試代碼:
package tree. test;
import tree. MyBinaryTree;
public class MyBinaryTreeTest {
private static final int [ ] arr = { 1 , 4 , 5 , 2 , 6 } ;
public static void main ( String[ ] args) {
MyBinaryTree< Integer> tree = new MyBinaryTree < Integer> ( ) ;
System. out. println ( "== 依次添加:" ) ;
tree. setMroot ( 3 ) ;
for ( int i = 0 ; i < arr. length; i++ ) {
System. out. print ( arr[ i] + "\t" ) ;
tree. insertNode ( arr[ i] ) ;
}
System. out. print ( "\n先序遍歷:" ) ;
tree. preorder ( ) ;
System. out. print ( "\n中序遍歷:" ) ;
tree. inorder ( ) ;
System. out. print ( "\n後序遍歷:" ) ;
tree. postorder ( ) ;
System. out. println ( ) ;
boolean contains = tree. contains ( 5 ) ;
System. out. println ( contains) ;
System. out. println ( "MinValue:" + tree. findMin ( ) ) ;
System. out. println ( "MaxValue:" + tree. findMax ( ) ) ;
System. out. println ( "刪除節點:" + tree. removeNode ( 5 ) ) ;
System. out. print ( "刪除節點後先序遍歷:" ) ;
tree. preorder ( ) ;
System. out. print ( "\n刪除節點後中序遍歷:" ) ;
tree. inorder ( ) ;
System. out. print ( "\n刪除節點後後序遍歷:" ) ;
tree. postorder ( ) ;
}
}