二叉搜索樹

排序二叉樹的性質:
java

  1. 若是左子樹不爲空,則左子樹上的點都小於根節點。node

  2. 若是右子樹不爲空,則右子樹上的點都大於根節點。this

  3. 根節點的左子樹和右子樹都是二叉排序樹spa

排序二叉樹的添加操做
code

  1. 從根節點開始,做爲當前節點排序

  2. 那當前節點與插入節點的值進行比較
    圖片

  3. 若比當前節點大,把當前節點的右子節點做爲當前結點,比當前節點的小,將左節點做爲當前節點進行比較get

  4. 重複2,3步驟直到找到合適的葉子結點class

  5. 若比葉子節點大,就插到葉子結點的右子節點,反之插到左子節點二叉樹

排序二叉樹的刪除操做的狀況有下面四種

  1. 無子節點,直接刪除

  2. 只有左子樹或左節點,將刪除節點的左節點做爲根節點便可

  3. 只有右子樹或右節點,將刪除節點的右子節點做爲根節點

  4. 即有右子樹,又有左子樹,這種狀況爲了方便本身記憶,我是隻採起一種方法,就是採起該刪除節點的前驅節點或後繼節,來補刪除節點的位置。(前驅節點就是比刪除節點全部小的節點中裏面最大的值,後繼節點就是比刪除節點都大的節點中的最小點)(2 7 8 10 15 17)例如刪除節點是10,則前驅就是8,後繼就是15


如圖片上的,刪除20這個點,能夠用前驅15或後繼30來做爲補位的節點

public class BinarySortTree {
	public static class Node {
		private int data;
		private String name;
		private Node leftNode;
		private Node rightNode;
		private Node parent;

		public Node(int data, Node parentNode) {
			super();
			this.data = data;
			this.parent = this.parent;
		}

		public Node(int data, String name) {
			super();
			this.data = data;
			this.name = name;
		}
		public Node(int data) {
			super();
			this.data = data;
		}
		public Node() {
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public int getData() {
			return data;
		}
		public void setData(int data) {
			this.data = data;
		}

		public Node getLeftNode() {
			return leftNode;
		}

		public void setLeftNode(Node leftNode) {
			this.leftNode = leftNode;
		}

		public Node getRightNode() {
			return rightNode;
		}

		public void setRightNode(Node rightNode) {
			this.rightNode = rightNode;
		}

		public Node getParent() {
			return parent;
		}

		public void setParent(Node parent) {
			this.parent = parent;
		}
	}
	
	private Node root;
	
	public Node addNode(Node node){
		if(root==null){
			root=node;
		}else{
			Node parent=getNodeIndex(root, node.getData());
			node.parent=parent;
			if(parent.getData()>node.getData()){
				parent.leftNode=node;
			}else{
				parent.rightNode=node;
			}
		}
		
		return root;
	}
	
	private Node getNodeIndex(Node node,int data){
		if(data>=node.getData()){
			if(node.getRightNode()==null){
				return node;
			}else{
				return getNodeIndex(node.rightNode, data);
			}
		}else {
			if(node.getLeftNode()==null){
				return node;
			}else{
				return getNodeIndex(node.leftNode, data);
			}
		}
	}
	//廣度遍歷
	public void breadth(){
		Queue<Node> queue=new ArrayDeque<>();
		if(root!=null){
			queue.add(root);
			while(!queue.isEmpty()){
				Node node=queue.poll();
				if(node.leftNode!=null)
					queue.add(node.leftNode);
				if(node.rightNode!=null)
					queue.add(node.rightNode);
				System.out.print(node.getData()+"-");
			}
		}
	}
	//中序遍歷
	public void middle(){
		if(root!=null){
			pMiddle(root);
		}
	}
	private void pMiddle(Node node){
		if(node!=null){
			if(node.leftNode!=null)
			{
				pMiddle(node.leftNode);
			}
			System.out.println(node.getData());
			if(node.rightNode!=null){
				pMiddle(node.rightNode);
			}
		}
	}
	
	public void delete(int data){
		if(root!=null){
			Node node=search(root, data);
			if(node.leftNode==null&node.rightNode==null){
				Node parentNode=node.parent;
				if(parentNode.leftNode.getData()==data){
					parentNode.leftNode=null;
				}else {
					parentNode.rightNode=null;
				}
			}
			if(node.leftNode==null){
				Node parentNode=node.parent;
				if(parentNode.leftNode.getData()==data){
					parentNode.leftNode=node.rightNode;
				}else {
					parentNode.rightNode=node.rightNode;
				}
			}
			if(node.rightNode==null){
				Node parenNode=node.parent;
				if(parenNode.leftNode.getData()==data){
					parenNode.leftNode=node.leftNode;
				}else{
					parenNode.rightNode=node.leftNode;
				}
			}
			//既有右子樹,又有作子樹
			if(node.rightNode!=null&node.leftNode!=null){
				Node preNode=findPreNode(node);
				Node preParentNode=preNode.parent;
				if(preParentNode.leftNode.getData()==preNode.getData()){
					preParentNode.leftNode=null;
				}else{
					preParentNode.rightNode=null;
				}
				preNode.rightNode=node.rightNode;
				node.rightNode.parent=preNode;
				preNode.leftNode=node.leftNode;
				node.leftNode.parent=preNode;
				Node parentNode=node.parent;
				parentNode.rightNode=preNode;
			}
		}
	}
	/**
	 * 查找某個點的前驅節點
	 * @param node
	 * @return
	 */
	private Node findPreNode(Node node){
		Node rightSonNode=node.leftNode;
		while(rightSonNode.rightNode!=null){
			rightSonNode=rightSonNode.rightNode;
		}
		return rightSonNode;
	}
	/**
	 * 從根節點開始查找節點
	 * @param node
	 * @param data
	 * @return
	 */
	public Node search(Node node,int data){
		
		if(data==node.getData())
			return node;
		if(data>node.getData()){
			if(node.rightNode!=null){
				return search(node.rightNode, data);
			}else{
				return null;
			}
				
		}else{
			if(node.leftNode!=null){
				return search(node.leftNode, data);
			}else{
				return null;
			}
		}
	}
	public static void main(String[] args) {
		BinarySortTree tree=new BinarySortTree();
		tree.addNode(new Node(5));
		tree.addNode(new Node(20));
		tree.addNode(new Node(10));
		tree.addNode(new Node(3));
		tree.addNode(new Node(8));
		tree.addNode(new Node(15));
		tree.addNode(new Node(30));
		tree.middle();
		tree.delete(20);
		tree.middle();
	}
}

相關文章
相關標籤/搜索