Java实现二叉排序树

点击进入尚硅谷数据结构和算法Java代码导航

import java.util.Stack;

class Node{
	int data;
	Node left;
	Node right;
	public Node(int data) {
		this.data = data;
	}
}
public class BinarySortTree {

	Node root;
	//添加节点
	public void add(int value) {
		this.add(value, this.root);
	}
	public void add(int value, Node node) {
		if(this.root == null) {
			this.root = new Node(value);
		}else {
			//大于放在右边
			if(value > node.data) {
				if(node.right == null) {
					node.right = new Node(value);
				}else {
					add(value, node.right);
				}
			}else {//小于等于放在左边
				if(node.left == null) {
					node.left = new Node(value);
				}else {
					add(value, node.left);
				}
			}
		}
	}
	//非递归中序遍历,正好是从小到大
	public void inOrder() {
		Node temp = this.root;
		Stack<Node> stack = new Stack<Node>();
		while(!stack.isEmpty() || temp != null) {
			if(temp != null) {
				stack.push(temp);
				temp = temp.left;
			}else {
				temp = stack.pop();
				System.out.print(temp.data + " ");
				temp = temp.right;
			}
		}
	}
	//删除节点
	public void delNode(int value) {
		Node target = search(value);
		if(target == null) {
			System.out.println("BinarySortTree does not have this Node!");
			return;
		}else {
			Node parent = searchParent(value);
			//1,如果target是叶子节点
			if(target.left == null && target.right == null) {
				//如果target是根节点
				if(parent == null) {
					this.root =null;
				}else {
					//如果target是parent的左子节点
					if(parent.left != null && parent.left.data == value) {
						parent.left = null;
					}else {//否则一定是右子节点
						parent.right = null;
					}
				}
			//2,如果target左子节点为空,右子节点不为空
			}else if(target.left == null && target.right != null){
				//如果target是根节点
				if(parent == null) {
					this.root = target.right;
				//如果target是parent的左子节点
				}else if(parent.left != null && parent.left.data == value){
					parent.left = target.right;
				}else {
					parent.right = target.right;
				}
			//3,如果target右子节点为空,左子节点不为空
			}else if(target.left != null && target.right == null) {
				//如果target是根节点
				if(parent == null) {
					this.root = target.left;
				//如果target是parent的左子节点
				}else if(parent.left != null && parent.left.data == value){
					parent.left = target.left;
				}else {
					parent.right = target.left;
				}
			//4,如果如果左右子节点均不为空,找到左子树的最大值k(或者右子树的最小值),删除k的节点,用k代替target的值
			}else {
				Node temp = target.left;
				//找到左子树的最大值,这里不需要讨论target是否为root
				while(temp.right != null) {
					temp = temp.right;
				}
				int k = temp.data;
				delNode(k);
				target.data = k;
			}
		}
	}
	//查找值位value的节点
	public Node search(int value) {
		return search(value, root);
	}
	public Node search(int value, Node node) {
		if(node == null) {
			return null;
		}else {
			if(node.data == value) {
				return node;
			}else if(value > node.data) {
				return search(value, node.right);
			}else {
				return search(value, node.left);
			}
		}
	}
	//查找值位value的节点的父节点
	public Node searchParent(int value) {
		if(this.root.data == value) {
			return null;
		}else {
			return searchParent(value, this.root);
		}
	}
	public Node searchParent(int value, Node node) {
		if((node.left != null && node.left.data == value) || (node.right != null && node.right.data == value)){
			return node;
		}else if(node.right != null && value > node.data) {
			return searchParent(value, node.right);
		}else if(node.left != null && value <= node.data) {
			return searchParent(value, node.left);
		}else {
			return null;
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int[] arr = {7,3,10,12,5,1,9};
		BinarySortTree bst = new BinarySortTree();
		for(int i=0; i<arr.length; i++) {
			bst.add(arr[i]);
		}
		bst.inOrder();
		System.out.println();
		bst.delNode(7);
		bst.inOrder();
	}

}
//              7
//          3      10
//       1    5  9    12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值