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 ( ) ;
}
}