数据结构-二叉树(一)

用链表来实现二叉树存储结构
二叉树
算法代码


/**
 * 
 * @ClassName: TreeNode
 * @Description: 树的节点
 * @author: fuling
 * @date: 2020年8月23日 下午2:24:06
 */
public class TreeNode {
	private int id;
	private String ele;
	private TreeNode left; //当前节点的左节点
	private TreeNode right; //当前节点的右节点
	
	
	public TreeNode() {
		super();
		// TODO Auto-generated constructor stub
	}
	public TreeNode(int id, String ele) {
		super();
		this.id = id;
		this.ele = ele;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getEle() {
		return ele;
	}
	public void setEle(String ele) {
		this.ele = ele;
	}
	public TreeNode getLeft() {
		return left;
	}
	public void setLeft(TreeNode left) {
		this.left = left;
	}
	public TreeNode getRight() {
		return right;
	}
	public void setRight(TreeNode right) {
		this.right = right;
	}
	@Override
	public String toString() {
		return "TreeNode [id=" + id + ", ele=" + ele + "]";
	}
	
	/**
	 * 
	 * @Title: preOrder
	 * @Description: 前序遍历
	 * 算法:
	 * 1.输出当前节点信息
	 * 2.如果当前节点左子树不为空:遍历当前节点的左子树
	 * 3.如果当前节点右子树不为空:遍历当前节点的右子树
	 * @return: void
	 */
	public void preOrder() {
		//1.输出当前节点信息
		System.out.println(this);
		
		//2.如果当前节点左子树不为空:遍历当前节点的左子树
		if(this.left != null)this.left.preOrder();
		
		//3.如果当前节点右子树不为空:遍历当前节点的右子树
		if(this.right != null)this.right.preOrder();
	}
	
	/**
	 * 
	 * @Title: infixOrder
	 * @Description: 中序遍历
	 * 算法:
	 * 1.如果当前节点左子树不为空:遍历当前节点的左子树
	 * 2.输出当前节点信息
	 * 3.如果当前节点右子树不为空:遍历当前节点的右子树
	 * @return: void
	 */
	public void infixOrder() {
		//1.如果当前节点左子树不为空:遍历当前节点的左子树
		if(this.left != null)this.left.infixOrder();
		
		//2.输出当前节点信息
		System.out.println(this);
		
		//3.如果当前节点右子树不为空:遍历当前节点的右子树
		if(this.right != null)this.right.infixOrder();
	}
	
	/**
	 * 
	 * @Title: postOrder
	 * @Description: 后序遍历
	 * @return: void
	 * 算法:
	 * 1.如果当前节点左子树不为空:遍历当前节点的左子树 
	 * 2.如果当前节点右子树不为空:遍历当前节点的右子树
	 * 3.输出当前节点信息
	 */
	public void postOrder() {
		//1.如果当前节点左子树不为空:遍历当前节点的左子树
		if(this.left != null)this.left.postOrder();
		
		//2.如果当前节点右子树不为空:遍历当前节点的右子树
		if(this.right != null)this.right.postOrder();
		
		//3.输出当前节点信息
		System.out.println(this);
	}
	
	/**
	 * 
	 * @Title: preSearch
	 * @Description: 前序查找
	 * @param: @param ele 所要查找的参数
	 * @return: TreeNode 查找到的节点,如果找不到,则返回null
	 * 算法:
	 * 1.比较当前元素是否与所查找参数匹配,是则返回该元素
	 * 2.否则若当前节点左子树不为空,就向左子树继续查找,若从左子树找到了,则返回
	 * 3.若从左子树找不到,当前节点若右子树不为空,向右子树继续查找,找到了,则返回
	 * 4.找不到,返回null
	 */
	public TreeNode preSearch(String ele) {
		//1.比较当前元素是否与所查找参数匹配,是则返回该元素
		if(this.ele.equals(ele))return this;
		
		TreeNode node = null;
		
		//否则若当前节点左子树不为空,就向左子树继续查找,若从左子树找到了,则返回
		if(this.left != null)node = this.left.preSearch(ele);
		if(node != null)return node;
		
		//3.若从左子树找不到,当前节点若右子树不为空,向右子树继续查找
		if(this.right != null)node = this.right.preSearch(ele);
		
		//4.从右边找到了,返回元素,找不到,返回null
		return node;
		
	}
	
	/**
	 * 
	 * @Title: remove
	 * @Description: 删除指定的元素,若该元素包含子树,则一并删除
	 * @param: @param ele 指定的值
	 * @return: TreeNode 删除成功则返回该元素,否则返回null
	 * 算法:
	 * 1.若左子树不为空,判断左子树节点是否匹配,是则把当前节点的左子树置空,返回该左子树节点
	 * 2.否则,若右子树不为空,判断右子树节点是否匹配,是则把当前节点的右子树置空,返回该右子树节点
	 * 3.否则,当左子树不为空时,遍历搜寻左子树
	 * 4.若返回结果为空,则当右子树不为空时,遍历搜寻右子树,返回结果;
	 */
	public TreeNode remove(String ele) {
		TreeNode node = null;
		
		//1.若左子树不为空,判断左子树节点是否匹配,是则把当前节点的左子树置空,返回该左子树节点
		if(this.left != null && this.left.ele == ele) {
			node = this.left;
			this.left = null;
			return node;
		}
		
		//2.否则,若右子树不为空,判断右子树节点是否匹配,是则把当前节点的右子树置空,返回该右子树节点
		if(this.right != null && this.right.ele == ele) {
			node = this.right;
			this.right = null;
			return node;
		}
		
		//3.否则,当左子树不为空时,遍历搜寻左子树
		if(this.left != null)node = this.left.remove(ele);
		if(node != null)return node;
		
		//4.若返回结果为空,则当右子树不为空时,遍历搜寻右子树,返回结果;
		if(this.right != null)node = this.right.remove(ele);
		return node;
		
		
	}
}


/**
 * 
 * @ClassName: LinkListTree
 * @Description: 链表实现的二叉树存储结构
 * @author: fuling
 * @date: 2020年8月23日 下午2:21:50
 */
public class LinkListBinaryTree {

	private TreeNode root;//树的根节点

	public LinkListBinaryTree(TreeNode root) {
		super();
		this.root = root;
	}

	public TreeNode getRoot() {
		return root;
	}

	public void setRoot(TreeNode root) {
		this.root = root;
	}
	
	/**
	 * 
	 * @Title: preOreder
	 * @Description: 前序遍历
	 * @return: void
	 * @throws RuntimeException 若树为空,抛异常
	 */
	public void preOreder() {
		if(root == null)throw new RuntimeException("树为空!");
		root.preOrder();
	}
	
	/**
	 * 
	 * @Title: infixOrder
	 * @Description: 中序遍历
	 * @return: void
	 * @throws RuntimeException 若树为空,抛异常
	 */
	public void infixOrder() {
		if(root == null)throw new RuntimeException("树为空!");
		root.infixOrder();
	}
	
	/**
	 * 
	 * @Title: postOreder
	 * @Description: 后序遍历
	 * @return: void
	 * @throws RuntimeException 若树为空,抛异常
	 */
	public void postOreder() {
		if(root == null)throw new RuntimeException("树为空!");
		root.postOrder();
	}
	
	/**
	 * 
	 * @Title: preSearch
	 * @Description: 前序查找元素
	 * @param: @param ele 指定查找的值
	 * @return: TreeNode 找到则返回元素,否则返回null
	 * @throws RuntimeException 若树为空,抛异常
	 */
	public TreeNode preSearch(String ele) {
		
		if(root == null)throw new RuntimeException("树为空!");
		return root.preSearch(ele);
	}
	
	/**
	 * 
	 * @Title: remove
	 * @Description: 删除指定元素
	 * @param: @param ele 指定的值
	 * @return: TreeNode 删除成功则返回删除的元素,否则返回null
	 * @throws RuntimeException 若树为空,抛异常
	 */
	public TreeNode remove(String ele) {
		if(root == null)throw new RuntimeException("树为空!");
		
		//判断根节点是否匹配
		if(root.getEle().equals(ele)) {
			TreeNode node = root;
			root = null;
			return node;
		}
		
		return root.remove(ele);
	}
	
	
}

测试代码

public class MainTest {

	public static void main(String[] args) {
		LinkListTreeBinaryTest();
	}
	public static void LinkListTreeBinaryTest() {
		//手动建树
		TreeNode node1 = new TreeNode(1, "哆啦");
		TreeNode node2 = new TreeNode(2, "柴犬");
		TreeNode node3 = new TreeNode(3, "英短");
		TreeNode node4 = new TreeNode(4, "柯基");
		TreeNode node5 = new TreeNode(5, "二哈");
		node1.setLeft(node2);
		node1.setRight(node3);
		node2.setLeft(node4);
		node2.setRight(node5);
		
		LinkListBinaryTree tree = new LinkListBinaryTree(node1);
		System.out.println("前序遍历:");
		tree.preOreder();
		System.out.println("中序遍历:");
		tree.infixOrder();
		System.out.println("后序遍历:");
		tree.postOreder();
		
//		System.out.println("查找柯基");
//		TreeNode node = tree.preSearch("柯基");
//		if(node != null)System.out.println("找到啦:" + node);
//		else System.out.println("找不到该元素");
		
//		System.out.println("删除前前序遍历");
//		tree.preOreder();
//		System.out.println("删除柯基");
//		TreeNode remove = tree.remove("柯基");
//		if(remove != null)System.out.println("删除成功!");
//		else System.out.println("删除失败");
//		System.out.println("删除后前序遍历");
//		tree.preOreder();
	}

源代码github地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值