`
遛遛遛
  • 浏览: 52642 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

排序二叉树java的简单实现

 
阅读更多

本程序实现了基本的对排序二叉树的增和删。

 

 

 

public class SortTreeTest {
	public static void main(String[] args) {
		SortTree tree = new SortTree(10); // 初始化一个root并且给一个value
		tree.add(7);
		tree.add(15);
		tree.add(12);
		tree.add(16);
		tree.add(7);
		tree.add(8);
		tree.add(4);
		tree.add(13);

		tree.read();
		System.out.println("root.value = " + tree.getRoot().getValue());
		tree.delete(10);
		System.out.println("---------after delete---------");
		tree.read();
		System.out.println("root.value = " + tree.getRoot().getValue());
	}
}

class SortTree {
	private Node root;
	private int size;

	public SortTree(int v) {
		root = new Node(v);
		size = 1;
	}

	public Node getRoot() {
		return root;
	}

	public void setRoot(Node root) {
		this.root = root;
	}

	public int Size() {
		return size;
	}

	public void add(int value) {
		if (root == null)
			return;
		Node indexRoot = getRoot();
		Node parent = indexRoot;
		int indexValue = 0;
		while (indexRoot != null) {
			indexValue = indexRoot.getValue();
			parent = indexRoot;
			if (value < indexValue) {
				indexRoot = indexRoot.getLeft();
			} else if (value > indexValue) {
				indexRoot = indexRoot.getRight();
			} else {
				return;
			}
		}
		Node newNode = new Node(value);
		if (value < indexValue) {
			parent.setLeft(newNode);
		} else if (value > indexValue) {
			parent.setRight(newNode);
		} else {
			return;
		}
		newNode.setParent(parent);
		size++;
	}

	public void read() { // 中序遍历
		read(root);
	}

	public void read(Node node) {
		if (node.getLeft() != null) {
			read(node.getLeft());
		}
		if (node != null) {
			System.out.println(node.getValue());
		}
		if (node.getRight() != null) {
			read(node.getRight());
		}
	}

	public void delete(int value) {
		if (root == null)
			return;
		Node indexRoot = getRoot();
		Node parent = indexRoot;
		int indexValue = indexRoot.getValue();
		while (indexValue != value && indexRoot != null) {
			parent = indexRoot;
			if (value < indexValue) {
				indexRoot = indexRoot.getLeft();
			} else if (value > indexValue) {
				indexRoot = indexRoot.getRight();
			}
			if (indexRoot != null) {
				indexValue = indexRoot.getValue();
			}
		}

		if (indexRoot == null) {
			return;
		}

		// no any nodes
		if (indexRoot.getLeft() == null && indexRoot.getRight() == null) {
			if (parent.getLeft() == indexRoot) { // if is leftNode
				parent.setLeft(null);
			} else { // if is rightNode
				parent.setRight(null);
			}
			return;
		}

		// has only left node
		if (indexRoot.getLeft() != null && indexRoot.getRight() == null) {
			if (indexRoot == this.getRoot()) { // if deleted is root
				setRoot(indexRoot.getLeft());
				indexRoot = null;
			} else {
				parent.setLeft(indexRoot.getLeft());
				indexRoot.getLeft().setParent(parent);
				indexRoot = null;
			}
			return;
		}

		// has only right node
		if (indexRoot.getLeft() == null && indexRoot.getRight() != null) {
			if (indexRoot == this.getRoot()) { // if deleted is root
				setRoot(indexRoot.getRight());
				indexRoot = null;
			} else {
				parent.setRight(indexRoot.getRight());
				indexRoot.getRight().setParent(parent);
				indexRoot = null;
			}
			return;
		}

		// has two node
		if (indexRoot.getLeft() != null && indexRoot.getRight() != null) {

			// 找到删除节点的后继节点
			Node afterNode = indexRoot.getRight();
			Node afterFather = indexRoot;
			while (afterNode.getLeft() != null) {
				afterFather = afterNode;
				afterNode = afterNode.getLeft();
			}

			if (afterFather == indexRoot) {
				parent.setRight(afterNode);
				afterNode.setParent(parent);
				afterNode.setLeft(indexRoot.getLeft());
				indexRoot.getLeft().setParent(afterNode);
				if (indexRoot == this.getRoot()) { //if delete is root
					setRoot(afterNode);
				}
				
			} else {
				//比较复杂
				if(afterNode.getRight()!= null) {
				afterFather.setLeft(afterNode.getRight());
				afterNode.getRight().setParent(afterFather);
				}else {
					afterFather.setLeft(null);
				}
				afterNode.setRight(indexRoot.getRight());
				indexRoot.getRight().setParent(afterNode);
				parent.setRight(afterNode);
				afterNode.setParent(parent);
				afterNode.setLeft(indexRoot.getLeft());
				indexRoot.getLeft().setParent(afterNode);
				if(indexRoot == this.getRoot()) {
					this.setRoot(afterNode);
				}
				
			}
			
			indexRoot = null;

		}
	}
}

 

忘记了放Node类,补上。

 

//Node类



public class Node {
	private Node left;
	private Node right;
	private int value;
	private Node parent;
	
	public Node(int v) {
		this.value = v;
	}
	public Node() {
	
	}
	public Node getLeft() {
		return left;
	}
	public void setLeft(Node left) {
		this.left = left;
	}
	public Node getRight() {
		return right;
	}
	public void setRight(Node right) {
		this.right = right;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	public Node getParent() {
		return parent;
	}
	public void setParent(Node parent) {
		this.parent = parent;
	}
	
	
}
 

 

 

 

输出:

 

 

 

4

7

8

10

12

13

15

16

root.value = 10

---------after delete---------

4

7

8

12

13

15

16

root.value = 12


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics