我的伟大航路(11)

有两三天没写,光做题了,主要还是为了记录学习

今天开始学习了树这种结构
对于树,在计算机中有很多体现的地方,像是文件系统

这里直接记录二叉树的建立、遍历、查找和删除

假设本文的二叉树的例子是三层的,并自上而下,自左而右123456赋值

1、二叉树的建立
首先创建一个树的节点

public class TreeNode {
	// 节点的权
	int value;
	// 左儿子
	TreeNode leftNode;
	// 右儿子
	TreeNode rightNode;

	public TreeNode(int value) {
		this.value = value;
	}
		// 设置左儿子
	public void setLeftNode(TreeNode leftNode) {
		this.leftNode = leftNode;
	}

	// 设置右儿子
	public void setRightNode(TreeNode rightNode) {
		this.rightNode = rightNode;
	}
	}

然后创建一个树类

public class BinaryTree {
	TreeNode root;

	// 设置根节点
	public void setRoot(TreeNode root) {
		this.root = root;
	}
	}

然后创建树的测试类,并添加节点

public class TestBinaryTree {
	public static void main(String[] args) {
		// 创建一棵树
		BinaryTree bintree = new BinaryTree();
		// 创建一个根节点
		TreeNode root = new TreeNode(1);
		// 把根节点赋给树
		bintree.setRoot(root);
		// 创建第二层节点
		// 创建左节点
		TreeNode rootL = new TreeNode(2);
		root.setLeftNode(rootL);
		// 创建右节点
		TreeNode rootR = new TreeNode(3);
		root.setRightNode(rootR);
		// 创建第三层节点
		rootL.setLeftNode(new TreeNode(4));
		rootL.setRightNode(new TreeNode(5));
		rootR.setLeftNode(new TreeNode(6));
		rootR.setRightNode(new TreeNode(7));

树的创建即为节点增加左右儿子节点,由此可以组成一棵树

2、二叉树的遍历

遍历分为三种遍历,分别是前序遍历、中序遍历和后序遍历
这里的前中后在官方解释中指的是对于根节点的前中后,因为树的遍历运用的是递归的思想,所以在递归中会把一个大树,分成一颗颗小树,即只有一个双亲结点和两个儿子节点,所以我认为这里的前中后指的是每个小树的那一个双亲结点,值得注意的是这里我反复强调递归的思想,所谓递归就是化整为一,把一个庞大的问题仅仅想成一个个基础的解决

前序遍历

public void frontShow() {
		// 输出自身的value
		System.out.println(value);
		// 输出左节点的value
		if (leftNode != null) {
		//将当前节点的左儿子进行前序遍历
			leftNode.frontShow();
		}
		// 输出右节点的value
		if (rightNode != null) {
		//将当前节点的右儿子进行前序遍历
			rightNode.frontShow();
		}
	}

结果

1
2
4
5
3
6
7

中序遍历

public void midShow() {
		if (leftNode != null) {
			leftNode.midShow();
		}
		System.out.println(value);
		if (rightNode != null) {
			rightNode.midShow();
		}
	}

结果

4
2
5
1
6
3
7

后序遍历

	public void afterShow() {
		if (leftNode != null) {
			leftNode.afterShow();
		}
		if (rightNode != null) {
			rightNode.afterShow();
		}
		System.out.println(value);
	}

结果

4
5
2
6
7
3
1

从这三段代码不难看出,所谓三种遍历就是对于不同位置的先后输出

3、查找

查找即依据遍历的基础,根据传入的value,返回相同value的节点

这里仅是前序的查找

public TreeNode frontSearch(int i) {
		TreeNode target = null;
		if (this.value == i) {
			return this;
		} else {
			if (leftNode != null) {
				target = leftNode.frontSearch(i);
			}
			if (target != null) {
				return target;
			}
			if (rightNode != null) {
				target = rightNode.frontSearch(i);
			}
		}
		return target;
	}

从这里不难看出,几乎(因为我知道的不多所以不敢断定)所有的数据结构的增删改查都是基于查找的

4、删除

删除也是基于遍历的自然也有递归的思想

public void delete(int i) {
		TreeNode parent = this;
		if (parent.leftNode != null && parent.leftNode.value == i) {
			parent.leftNode = null;
			return;
		}
		if (parent.rightNode != null && parent.rightNode.value == i) {
			parent.rightNode = null;
			return;
		}
		parent = leftNode;
		if (parent != null) {
			parent.delete(i);
		}
		parent = rightNode;
		if (parent != null) {
			parent.delete(i);
		}
	}

做删除方法的时候需要注意其他方法会不会变为空指针异常

今天开始了树的学习,越来越感叹人类的强大,我们现在都是站在巨人的肩膀上看向未来的

往事不过五彩斑斓蜻蜓点水,你我呢喃皆随风语四散而去,人来人往只是日常
——网络原创

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值