データ構造とアルゴリズム - バイナリ・ソート木学習とJava実装

序文

データ構造及びアルゴリズムでは、各アルゴリズムは、利点と欠点を有します。
ないソート、より困難な検索;順番に保存されている:順番に保存されている並べ替え、削除、挿入困難の
チェーン店:かどうかの順序、見つけるのがより困難です。
上記の3つの点を踏まえ、我々は、バイナリ・ソートツリーを持っています。

バイナリソートツリー

ツリーバイナリ・ソート(バイナリソートの木)また、また、二分探索木として知られている二分探索木(バイナリ検索ツリー)、として知られています。バイナリソートツリーまたは空のツリーまたは以下の特性を有する二分木:
左サブツリーが空でない場合(1)、次に、すべてのノードは、左サブツリーの値未満であるか、またはルートノードと同じ;
(2)右の部分木が空でない場合、ノードの右の部分木は、すべての値は、ルートノードの値以上である;
(3)左及び右サブツリーは、バイナリソートツリーです。

バイナリソートツリー構造

package demo9;

public class BinarySortTree {
	Node root;
	/*
	 * 向二叉排序树中添加节点
	 */
	public void add(Node node) {
		//如果是一颗空树
		if(root==null) {
			root=node;
		}else {
			root.add(node);
		}
	}
	/*
	 * 中序遍历二叉排序树
	 */
	public void midShow() {
		if(root!=null) {
			root.midShow(root);
		}
	}
package demo9;

public class Node {
	int value;
	Node left;
	Node right;
	
	public Node (int value) {
		this.value=value;
	}
/*
 * 向子树中添加节点
 */
	public void add(Node node) {
		if(node==null) {
			return;
		}
			//判断传入的节点的值比当前子树的根节点的值是大是小
			//添加的节点比当前结点更小
			if(node.value<this.value) {
				//如果左节点为空
				if(this.left==null) {
					this.left=node;
					//如果不为空
				}else {
					this.left.add(node);
				}
				//右子树
			}else {
				if(this.right==null) {
					this.right=node;
					//如果不为空
				}else {
					this.right.add(node);
				}
			}
		}
/*
 * 中序遍历二叉排序,z中序遍历二叉排序树结果为从小到大的顺序
 */
	public void midShow(Node node) {
		if(node==null) {
			return;
		}
		midShow(node.left);
		System.out.println(node.value);
		midShow(node.right);
	}

テストカテゴリ:

public class TestBinarySortTree {
	public  static void main(String[] args) {
	int [] arr=new int [] {7,3,10,12,5,1,9};
	//创建一颗二叉排序树
	BinarySortTree bst=new  BinarySortTree();
	//循环添加
	for(int i:arr) {
		bst.add(new Node(i));
		}
	//查看树中的值
	bst.midShow();

上記の手順の後、我々は成功したバイナリ・ソートツリーを作成している、と木を確立するために、簡単なテストによって判断することができます正しい、より簡単な方法の一つは、バイナリ・ソートツリーのために、順序でツリーを走査することですトラバーサルの結果は、値の上昇系列でソートされなければならない特性、順序どおり

最小値とツリーの最大値を求めます

なぜなら、それがある場合に最小値が右端のサブツリー内不可避最大左端のサブツリーでなければならないバイナリソートツリーの特徴は、当然のことながら、最小次いで、それはツリーのノードのみであるならば、いかなるツリーは、存在しない空と最大値は、ルートノード自体であります

バイナリ・ソートの木を探します

コードを見ることができ、特定の実装を見つけることは比較的簡単である、ノードが特定の値が含まれている検索:

/*
	 * 查找节点
	 */
	public Node search(int value) {
		if(root==null) {
			return null;
		}else {
			return root.search(value);
		}
	}
/**
	 * 查找节点
	 */
	public Node search(int value) {
		if(this.value==value){
			return this;
	}else if(value<this.value){
		if(left==null) {
			return null;
		}
		return left.search(value);
	}else{
		if(right==null) {
			return null;
		}
		return right.search(value);
		}
	}

削除バイナリ・ソートツリー

削除バイナリ・ソートツリーノードが主として時間の削除に、最も複雑なものの場所で、多くの場合があります

削除されたノードは全く残っていないと、右部分木の
ノードは左のみサブツリーが削除され
たノードのみが右部分木があり、削除
ノードが残っていると右のサブツリーを削除し
、最初の3例、より良い取引が、自分の子供に向いて父親に直接それを作ります最後に、コードをより複雑に組み合わさ直接見ては、より簡単なコメントを理解します:


	/**
	 * 删除节点
	 */
	public void delete(int value) {
		if(root==null) {
			return;
		}else {
			//找到这个节点
			Node target=search(value);
			//如果没有这个节点
			if(target==null) {
				return;
			}
			//找到他的父节点
			 Node parent=searchParent(value);
			//要删除的节点是叶子节点
			 if(target.left==null&&target.right==null) {
				 //要删除的节点是父节点的左子节点
				 if(parent.left.value==value) {
					 parent.left=null;
					 //要删除的节点是右节点
				 }else {
					 parent.right=null;
				 }
				 //要删除的节点有两个子节点 
			 }else if(target.left!=null&&target.right!=null) {
				 //删除右子树中值最小的节点,取刚获取到该节点的值
				 int min=deleteMin(target.right);
				 //替换目标节点中的值
				 target.value=min;
				//要删除的节点有一个左子节点或右字节点 
			 }else {
				 if(target.left!=null) {
					 //要删除的节点是左子节点
					 if(parent.left.value==value) {
						 parent.left=target.left;
						 //要删除的节点是右节点
					 }else {
						 parent.right=target.right;
					 }
					 
				//右子节点	 
				 }else {
					 if(parent.right.value==value) {
						 parent.right=target.right;
						 //要删除的节点是右节点
					 }else {
						 parent.right=target.right;
					 }
					 
				 }
			 }
		}
	}
	
	/**
	 * 删除一颗树中最小的值的节点
	 * @param right
	 * @return
	 */
	private int deleteMin(Node node) {
		Node target=node;
		//递归向左找
		while(target.left!=null) {
			target=target.left;
		}
		//删除最小值的这个节点
		delete(target.value);
		return target.value;
	}
	/*
	 * 搜索父节点
	 */
	public Node searchParent(int value) {
		if(root==null) {
			return null;
		}else {
			return root.searchParent(value);
		}
	}
}

/**
	 * 搜索父节点
	 */
	public Node searchParent(int value) {
		if((this.left!=null&&this.left.value==value)||(this.right!=null&&this.right.value==value)) {
			return this;
		}else {
			if(this.value>value&&this.left!=null) {
				return this.left.searchParent(value);
			}else if(this.value<value&&this.right!=null){
				return this.right.searchParent(value);
			}
			return null;
		}
	}
}

概要

主にバイナリ・ソートツリーの基本的な原則は、それは非常に複雑ではないの口コミ、及びコードの実装の仕方によって、バイナリ・ソートツリー、挿入を作成、検索、削除ファイルのことを学びました。これは、対応するノードは、学習過程での理解の独自の方法を描画するために組み合わせることができ、理解するのが最も困難な、より複雑であると言うことができます削除されます。

公開された28元の記事 ウォンの賞賛5 ビュー3719

おすすめ

転載: blog.csdn.net/qq_42711899/article/details/104587269