b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

详解二叉树的创建,遍历,查找,删除子树

电脑杂谈  发布时间:2019-07-23 20:09:01  来源:网络整理

二叉树的建立流程图_树与二叉树的区别_建立二叉排序树

一:创建一棵二叉树

1.1. 链式存储创建如下二叉树:

在这里插入图片描述

1.11创建一棵树:

public static void main(String[] args) {
		//创建一棵树
		BinaryTree binTree = new BinaryTree();
	}

这样就完成了一棵树的创建,可能大家会疑惑,这里面什么都没有,怎么叫创建一棵树呢?

这其实就是一颗空树

在这里插入图片描述

1.2二叉树的全部代码:

/**
 * 2019年2月15日
 */
package demo5;
/**
 * 测试二叉树的类
 *
 * 2019年2月15日
 */
public class TestBinary {
	
	public static void main(String[] args) {
		//创建一棵树
		BinaryTree binTree = new BinaryTree();
		
		//创建根节点
		TreeNode root =new  TreeNode(1);
		//把根节点赋给树
		binTree.setRoot(root);
	
		//创建左节点
		TreeNode NodeL  =new TreeNode(2);
		//创建右节点
		TreeNode NodeR = new TreeNode(3);
		//把左右节点添加到根节点
		root.setlNode(NodeL);
		root.setrNode(NodeR);
		
	}
}

package demo5;
/**
 * 创建二叉树:实现添加,查看根节点,添加左右节点
 *
 * 2019年2月15日
 */
public class BinaryTree {
	
	//根节点
	TreeNode root;
	
	//设置根节点
	public void setRoot(TreeNode root) {
		this.root = root;
	}
	
	//获取根节点
	public TreeNode getRoot() {
		return root;
	}
}

树与二叉树的区别_二叉树的建立流程图_建立二叉排序树

/**
 * 2019年2月15日
 */
package demo5;
/**
 * 二叉树的左右节点
 *
 * 2019年2月15日
 */
public class TreeNode {
	
	//设置节点的权(值)
	int value;
	//设置左节点
	TreeNode lNode;
	//设置右节点
	TreeNode rNode;
	
	public TreeNode(int value){
		value=this.value;		
	}
	
	//设置左节点
	public void setlNode(TreeNode lNode) {
		this.lNode = lNode;
	}
	//设置右节点
	public void setrNode(TreeNode rNode) {
		this.rNode = rNode;
	}
}

二:二叉树的遍历

2.二叉树的三种遍历

前序遍历:根节点–左节点-右节点

中序遍历:左节点–根节点—右节点

后序遍历:左节点-右节点–根节点

前中后都是相对于根节点而言

无论哪种遍历都是先左后右

在这里插入图片描述

对于上图:

前序:1 – 2 – 4 – 5 – 3 – 6 – 7

树与二叉树的区别_建立二叉排序树_二叉树的建立流程图

中序:4 – 2 – 5 – 1 – 6 – 3 --7

后序:4 – 5 – 2 – 6 – 7 – 3 – 1

大家也许已经发现,这是一个递归的思想

2.2.添加遍历的代码:

// 前序遍历
	public void frontShow() {
		// 先打印自己,然后左节点,之后右节点
		System.out.print(value + " ");
		// 判断左节点
		if (leftNode != null) {
			leftNode.frontShow();
		}
		// 判断右节点
		if (rightNode != null) {
			rightNode.frontShow();
		}
	}
	// 中序遍历
	public void middleShow() {
		// 先打印左,然后自己,之后右节点
		// 判断左节点
		if (leftNode != null) {
			leftNode.middleShow();
		}
		System.out.print(value + " ");
		// 判断右节点
		if (rightNode != null) {
			rightNode.middleShow();
		}
	}
	// 后序遍历
	public void afterShow() {
		// 先左节点,之后右节点,最后打印自己
		// 判断左节点
		if (leftNode != null) {
			leftNode.afterShow();
		}
		// 判断右节点
		if (rightNode != null) {
			rightNode.afterShow();
		}
		System.out.print(value + " ");
	}

2.3注意:在主方法中虽然是调用树的前序遍历

在这里插入图片描述

但是树里面的遍历方法并不起作用,而是在节点类写此方法

// 前序遍历
	public void frontShow() {
		// 他自己也不干事,而是调用root的方法
		root.frontShow();
	}

最后结果与我们推出的结果相同:

在这里插入图片描述

树与二叉树的区别_建立二叉排序树_二叉树的建立流程图

三:节点的查找:本质就是把树遍历一遍,然后找到我们想要的节点,如果有返回该节点,没有返回null

在TestBinary类中添加代码:
//查找树
		TreeNode result = binTree.frontSearch(3);
		System.out.println(result.equals(rootR));
在BinaryTree类中添加代码:
	//前序查找
	public TreeNode frontSearch(int i) {
		return root.frontSearch(i);
	}
在TreeNode类中添加代码:
// 前序查找
	//如果查找到值和节点权相同,返回该节点
	public TreeNode frontSearch(int i) {
		TreeNode target = null;
		// 对比当前节点的值
		if (this.value == i) {
			return this;
		} else {
			// 查找左儿子
			if (leftNode != null) {
				// 如果查不到,target仍为空
				target = leftNode.frontSearch(i);
			}
			// 如果不为空,在左儿子中已经找到
			if (target != null) {
				return target;
			}
			// 如果左儿子中没有找到
			if (rightNode != null) {
				target = rightNode.frontSearch(i);
			}
			return target;
		}
	}

运行结果,判断无误:

在这里插入图片描述

3.1不同方法查找的效率

如果你需要转生,请注意以下几点:\r\n#r1.转生的时候请取下所有装备\r\n2.1级vip会员转生等级为190级(需要3亿)\r\n3.2级vip会员转生等级为180级(需要2亿)\r\n4.3级vip会员转生等级为170级(需要1亿)\r\n5.4级vip会员转生需要160级(需要5千万)\r\n6.普通玩家转生需要200级(需要5亿)\r\n7.每次转生的能力获得比例为:hp/mp=转生次数*50,ap=转生次数*200\r\n#k你当前转生次数为:#r"+cm.getchar().getreborns()+"#k次,是否继续。日本研究者中村经过观察,发现同样的食物同样的量,肥胖男子用8~10分钟吃完,而消瘦者却用13~16分钟吃完,另外他还对食物进行了咀嚼次数调查,肥胖男子需要7.7次,肥胖女子需要8.1次,而普通男子需要8.9次,普通女子需要9.4次。在中国传统的阴阳历中以朔月的长度29.5306日为1个月的平均值,全年12个月,同回归年的长度365.2422日相差约10日21时,需要置闰,使阴阳历各个月份和天象物候保持对应的关系.我国古六历中用3年闰1个月,5年闰2个月,19年闰7个月的闰月法,每逢闰年所加的月便称为“闰月”.闰月放在一年的年终,例如,秦代和西汉初期使用的《颛项历》,以十月为岁首,把九月做为年终,闰月就放在九月之后,而称为“后九月”.到了西汉初制定太初历时,把闰月分插在一年的各月,并规定以没有中气的那几个月作为闰月,月序仍用上个月的月序,只要称其为“闰某月”.这一置闰规则在采用平气的历法中最合理的.到清代的时宪历时,则改用定气注历,如继续单纯以没有中心置闰的规则,有可能一年要置两个闰月.因此,又补充规定:以两次冬至之间包含有13个月的定为闰年,闰年的第一个没有中气的月定为闰月.这一规则一直沿用至今.闰年中以闰四、五、六月最多,闰九、十月最少,闰十一月、十二月和正月则不会出现,至少在几千年内是这样的.。

四:删除子树

4.1删除节点

删除节点也就是删除子树,在删除时会把节点及附带的所有子节点删除。

树与二叉树的区别_二叉树的建立流程图_建立二叉排序树

删除的节点原理也很简单:找到该节点建立二叉排序树,把他设置为空

删除节点分为根节点和普通的子节点两种,使用分支语句写

// 删除子树
	public void delete(int i) {
		// 分为两类,根节点和子节点
		if (root.value == i) {
			root = null;
		} else {
			root.delete(i);
		}
	}

递归实现杀死节点,每次判断是不是超出背包的重量如果是的话直接截取。那么下面就要说说先序遍历的非递归方式,遍历思想是这样的:先访问根节点在访问左节点, 最后访问右节点。bindlevel :build一个树结构,通过递归循环把当前节点加入到父节点中,形成一个完整的excel一样的树形结构。

//删除子树
	public void delete(int i) {
		TreeNode parent =this;
		//如果根节点不是
		if(parent.value==i){
			parent=null;
		}else{
		//判断左儿子
		if(parent.leftNode!=null&&parent.leftNode.value==i){
			//如果是,直接让他为null
			parent.leftNode=null;
			return;
		}
		//判断右儿子
		if(parent.rightNode!=null&&parent.rightNode.value==i){
			//如果是,直接让他为null
			parent.rightNode=null;
			return;
		}
		//如果都不是,往下一层进行
		
		//递归检查并删除左儿子
		parent =leftNode;
		if(parent!=null){
			parent.delete(i);			
		}
		
		//递归检查并删除右儿子
		parent =rightNode;
		if(parent!=null){
			parent.delete(i);			
		}
		}
	}

最后使用遍历方法查看是否成功删除子树(节点及其所有子节点)。

在删除根节点之后,可能会出现 “空指针异常的问题”,这是因为之前在遍历方法中没有写判断语句,

只有先判断有这棵树是否存在,才可以继续查看

// 前序遍历
	public void frontShow() {
		if (root != null) {
			root.frontShow();
		} else {
			System.out.println("当前树为空树");
		}
	}

**注意:添加删除之后,查看数据时,一定要加上判断是否为空的语句

**

至此,二叉树的创建,遍历,查找,删除子树就全部实现完成建立二叉排序树,以下为三个类的全部代码:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-115222-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...