数据结构作业:二叉排序树及其相关操作

版权声明: https://blog.csdn.net/King8611/article/details/83718060

写了一个简单的。

因为自己对泛型了解的还是不够到位,所以只能写个demo版的。

这课树没办法维持平衡,希望以后学一下红黑树,替罪羊树etc.
 

/*
 * 简单的二叉查找树
 * 没有自带旋转平衡
 * 写完这个我学一下
 * avl树还有红黑树
 */
public class SearchTree {
	private Node head;
	public void insert(int x) {								//插入函数
		Node node=new Node(x);
		if(head==null) {
			head=node;
			return;
		}
		Node cur=head;										//遍历节点
		while(cur!=null) {	
			if(cur.v>x) {									//如果x比较小
				if(cur.left==null) {
					cur.left=node;
					node.parent=cur;
					return;
				}else {					
					cur=cur.left;
				}
			}
			else {
				if(cur.right==null) {
					cur.right=node;
					node.parent=cur;
					return;
				}else {
					cur=cur.right;
				}
			}
		}
	}
	public Node find(int x) {								//查询是否包含x
		Node cur=head;
		while(cur!=null) {
			if(cur.v==x)
				return cur;
			if(cur.v>x)
				cur=cur.left;
			else
				cur=cur.right;
		}
		return null;
	}
	
	public void delete(int x) {								//删除节点函数
		Node node=find(x);									//找到和这个值对应的节点
		if(node==null)
			return ;
		if(node.left==null) {
			transPlant(node,node.right);				
		}
		else if(node.right==null) {
			transPlant(node,node.left);
		}
		else {
			Node cur=minNode(node.right);					//如果双子不是null,取其前驱,其实后继也行
			if(cur.parent!=node) {	
				transPlant(cur,cur.right);					//这两步看书上写的,感觉很妙
				cur.right=node.right;
				cur.parent.right=cur;
			}
			transPlant(node,cur);
			cur.left=node.left;
			cur.left.parent=cur;
		}
	}
	private void transPlant(Node u,Node v) {				//交换节点,为删除方法提供
		if(u.parent==null)									//如果这个点是根节点
			this.head=v;									//呃,这都很好理解吧
		else if(u==u.parent.left)
			u.parent.left=v;
		else 
			u.parent.right=v;
		if(v!=null)
			v.parent=u.parent;
	}
	public Node maxNode() {									//查询最大节点
		return maxNode(head);
	}
	private Node maxNode(Node node) {
		if(node==null)return null;
		return node.right==null?node:maxNode(node.right);
	}
	public Node minNode() {									//查询最大节点
		return minNode(head);
	}
	private Node minNode(Node node) {
		return node.left==null?node:maxNode(node.left);
	}
	
	public void print() {									//打印插入后的中根遍历
		dfs(head);
		System.out.println();
	}
	private void dfs(Node node) {							//中根遍历
		if(node==null)
			return;
		dfs(node.left);
		System.out.print(node+" ");
		dfs(node.right);
	}
	private class Node{
		int v;
		Node left;
		Node right;
		Node parent;
		public Node(int x) {
			v=x;
		}
		public String toString() {
			return v+"";
		}
	}
}

猜你喜欢

转载自blog.csdn.net/King8611/article/details/83718060