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

写了一个简单的。

因为自己对泛型了解的还是不够到位,所以只能写个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+"";
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、实验目的: 理解二叉树特别是完全二叉树的性质,掌握二叉树的存储结构(二叉链表);熟练掌握二叉树的常用操作算法(初始化、插入结点、删除结点、遍历等);初步掌握二叉树的应用。 二、实验内容: 要求采用二叉链表作为存储结构,完成二叉树的建立,前序、中序和后序遍历的操作,求所有叶子及结点总数的操作等。 具体要求如下: ①给出基于二叉链表的二叉树类的定义; ②给出二叉树初始化(构造函数)的实现; ③给出二叉树三种遍历算法的递归实现; ④二叉树先序遍历的非递归算法实现; ⑤利用二叉树的遍历算法求二叉树的结点数、二叉树的叶结点数、二叉树的高度; ⑥二叉树的撤销删除 三、实验步骤: 1、需求分析: 本演示程序用JAVA编写,完成树的生成,任意位置的插入、删除,以及遍历二叉树中的结点,查找和修改树中元素的值。 ① 输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;遍历时采用三种遍历方法中的一种遍历方法;修改操作时需要输入的元素的值;查找操作时,需要找到要查找元素的位置。在所有输入中,元素的值都是整数。 ② 输出的形式:在所有四种操作中都显示操作是否正确以及操作后树中的内容。其中删除操作后显示删除的元素的值,遍历二叉树中的元素,查找操作、修改操作后显示修改的值。 ③ 程序所能达到的功能:完成树的生成(通过插入操作)、插入、删除、遍历、查找、修改操作。 ④ 测试数据: A. 树中已有以50,25,75,12,37,43,30,33,87,93,97为关键字的结点 B. 插入操作中依次输入10,20,30,40,50,60,70,80,90,100十个数 C. 删除操作中输入10删除值为10的元素 D. 查找操作中输入20,30,40,50返回这个元素在树中的位置 2.概要设计: 1)为了实现上述程序功能,需要定义树的抽象数据类型: public int iData; public double dData; public Node leftChild; public Node rightChild; private Node root;int value; private Node getSuccessor; 基本操作:{ Tree () 操作结果:构造一个空的二叉树 insert () 初始条件:是否存在一个空二叉树 操作结果:往二叉树中插入数值 delete () 初始条件:存在一非空的二叉树 操作条件:将二叉树中的元素删除 displayTree () 初始条件:存在一非空的树 操作条件:显示非空树中的所有元素的值 getString () 初始条件:存在一非空的二叉树 操作结果:返回整个字符串的数值 getChar () 初始条件:存在一非空的二叉树 操作结果:返回字符型的数值 getInt () 初始条件:存在一非空的二叉树 操作结果:返回整型的数值 find () 初始条件:存在一非空二叉树 操作结果:从二叉树中查找某一元素 traverse () 初始条件:存在一非空的二叉树 操作结果:对二叉树中的元素进行遍历 preorder () 初始条件:存在一非空的二叉树 操作结果:对二叉树中的元素进行先根遍历 inOrder () 初始条件:存在一非空的二叉树 操作结果:对二叉树中的元素进行中根遍历 postOrder () 初始条件:存在一非空的二叉树 操作结果:对二叉树中的元素进行后根遍历 DisplayNode () 初始条件:存在一非空的二叉树 操作结果:显示出二叉树中的整形数值和双精度浮点型数值 public static void main 操作结果:调用主函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值