how2j.cn

本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



29分53秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器



示例 1 : 二叉树概念   
示例 2 : 二叉树排序-插入数据   
示例 3 : 二叉树排序-遍历   
示例 4 : 练习-英雄二叉树   
示例 5 : 答案-英雄二叉树   
示例 6 : 练习-比较冒泡法,选择法以及二叉树排序的性能区别   
示例 7 : 答案-比较冒泡法,选择法以及二叉树排序的性能区别   

二叉树由各种节点组成
二叉树特点:
每个节点都可以有左子节点,右子节点
每一个节点都有一个
二叉树概念
package collection; public class Node { // 左子节点 public Node leftNode; // 右子节点 public Node rightNode; // 值 public Object value; }
package collection;

public class Node {
	// 左子节点
	public Node leftNode;
	// 右子节点
	public Node rightNode;
	// 值
	public Object value;
}
示例 2 :

二叉树排序-插入数据

edit
假设通过二叉树对如下10个随机数进行排序
67,7,30,73,10,0,78,81,10,74
排序的第一个步骤是把数据插入到该二叉树中
插入基本逻辑是,小、相同的放左边大的放右边
1. 67 放在根节点
2. 7 比 67小,放在67的左节点
3. 30 比67 小,找到67的左节点7,30比7大,就放在7的右节点
4. 73 比67大, 放在67的右节点
5. 10 比 67小,找到67的左节点7,10比7大,找到7的右节点30,10比30小,放在30的左节点。
...
...
9. 10比67小,找到67的左节点7,10比7大,找到7的右节点30,10比30小,找到30的左节点10,10和10一样大,放在左边
二叉树排序-插入数据
package collection; public class Node { // 左子节点 public Node leftNode; // 右子节点 public Node rightNode; // 值 public Object value; // 插入 数据 public void add(Object v) { // 如果当前节点没有值,就把数据放在当前节点上 if (null == value) value = v; // 如果当前节点有值,就进行判断,新增的值与当前值的大小关系 else { // 新增的值,比当前值小或者相同 if ((Integer) v -((Integer)value) <= 0) { if (null == leftNode) leftNode = new Node(); leftNode.add(v); } // 新增的值,比当前值大 else { if (null == rightNode) rightNode = new Node(); rightNode.add(v); } } } public static void main(String[] args) { int randoms[] = new int[] { 67, 7, 30, 73, 10, 0, 78, 81, 10, 74 }; Node roots = new Node(); for (int number : randoms) { roots.add(number); } } }
示例 3 :

二叉树排序-遍历

edit
通过上一个步骤的插入行为,实际上,数据就已经排好序了。 接下来要做的是看,把这些已经排好序的数据,遍历成我们常用的List或者数组的形式

二叉树的遍历分左序,中序,右序
左序即: 中间的数遍历后放在左边
中序即: 中间的数遍历后放在中间
右序即: 中间的数遍历后放在右边
如图所见,我们希望遍历后的结果是从小到大的,所以应该采用中序遍历
二叉树排序-遍历
package collection; import java.util.ArrayList; import java.util.List; public class Node { // 左子节点 public Node leftNode; // 右子节点 public Node rightNode; // 值 public Object value; // 插入 数据 public void add(Object v) { // 如果当前节点没有值,就把数据放在当前节点上 if (null == value) value = v; // 如果当前节点有值,就进行判断,新增的值与当前值的大小关系 else { // 新增的值,比当前值小或者相同 if ((Integer) v -((Integer)value) <= 0) { if (null == leftNode) leftNode = new Node(); leftNode.add(v); } // 新增的值,比当前值大 else { if (null == rightNode) rightNode = new Node(); rightNode.add(v); } } } // 中序遍历所有的节点 public List<Object> values() { List<Object> values = new ArrayList<>(); // 左节点的遍历结果 if (null != leftNode) values.addAll(leftNode.values()); // 当前节点 values.add(value); // 右节点的遍历结果 if (null != rightNode) values.addAll(rightNode.values()); return values; } public static void main(String[] args) { int randoms[] = new int[] { 67, 7, 30, 73, 10, 0, 78, 81, 10, 74 }; Node roots = new Node(); for (int number : randoms) { roots.add(number); } System.out.println(roots.values()); } }
示例 4 :

练习-英雄二叉树

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
根据上面的学习和理解,设计一个Hero二叉树,HeroNode.
可以向这个英雄二叉树插入不同的Hero对象,并且按照Hero的血量倒排序

随机生成10个Hero对象,每个Hero对象都有不同的血量值,插入这个HeroNode后,把排序结果打印出来。
练习-英雄二叉树
示例 5 :

答案-英雄二叉树

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

3分17秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


为了方便打印效果,重写了Hero的toString()方法
答案-英雄二叉树
package collection; import java.util.ArrayList; import java.util.List; import charactor.Hero; public class HeroNode { public HeroNode leftHero; public HeroNode rightHero; // 声明为Hero类型 public Hero value; public void add(Hero v) { if (null == value) value = v; else { // 如果新英雄血量,比本节点大,就放在左边 if (v.hp > value.hp) { if (null == leftHero) leftHero = new HeroNode(); leftHero.add(v); } else { if (null == rightHero) rightHero = new HeroNode(); rightHero.add(v); } } } public List<Object> values() { List<Object> values = new ArrayList<>(); if (null != leftHero) values.addAll(leftHero.values()); values.add(value); if (null != rightHero) values.addAll(rightHero.values()); return values; } public static void main(String[] args) { List<Hero> hs = new ArrayList<>(); for (int i = 0; i < 10; i++) { Hero h = new Hero(); h.name = "hero " + i; h.hp = (float) (Math.random() * 900 + 100); // 100-1000的随机血量 hs.add(h); } System.out.println("初始化10个Hero"); System.out.println(hs); HeroNode heroTree = new HeroNode(); for (Hero hero : hs) { heroTree.add(hero); } System.out.println("根据血量倒排序后的Hero"); List<Object> treeSortedHeros = heroTree.values(); System.out.println(treeSortedHeros); } }
package charactor; public class Hero { public String name; public float hp; public int damage; public Hero() { } public Hero(String name) { this.name = name; } public String toString() { return String.format("[name:%s hp:%.0f]%n", name,hp); } }
示例 6 :

练习-比较冒泡法,选择法以及二叉树排序的性能区别

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
创建4万个随机数,然后用分别用冒泡法选择法二叉树3种排序算法进行排序,比较哪种更快
示例 7 :

答案-比较冒泡法,选择法以及二叉树排序的性能区别

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

9分34秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


答案-比较冒泡法,选择法以及二叉树排序的性能区别
package collection; import java.util.Arrays; import java.util.List; public class SortCompare { public static void main(String[] args) { //初始化随机数 int total = 40000; System.out.println("初始化一个长度是"+total+"的随机数字的数组"); int[] originalNumbers = new int[total]; for (int i = 0; i < originalNumbers.length; i++) { originalNumbers[i] = (int)(Math.random()*total); } System.out.println("初始化完毕"); System.out.println("接下来分别用3种算法进行排序"); //从初始化了的随机数组复制过来,以保证,每一种排序算法的目标数组,都是一样的 int[] use4sort; use4sort= Arrays.copyOf(originalNumbers, originalNumbers.length); int[] sortedNumbersBySelection= performance(new SelectionSort(use4sort),"选择法"); use4sort= Arrays.copyOf(originalNumbers, originalNumbers.length); int[] sortedNumbersByBubbling=performance(new BubblingSort(use4sort),"冒泡法"); use4sort= Arrays.copyOf(originalNumbers, originalNumbers.length); int[] sortedNumbersByTree=performance(new TreeSort(use4sort),"二叉树"); System.out.println("查看排序结果,是否是不同的数组对象"); System.out.println(sortedNumbersBySelection); System.out.println(sortedNumbersByBubbling); System.out.println(sortedNumbersByTree); System.out.println("查看排序结果,内容是否相同"); System.out.println("比较 选择法 和 冒泡法 排序结果:"); System.out.println(Arrays.equals(sortedNumbersBySelection, sortedNumbersByBubbling)); System.out.println("比较 选择法 和 二叉树 排序结果:"); System.out.println(Arrays.equals(sortedNumbersBySelection, sortedNumbersByTree)); } interface Sort{ void sort(); int[] values(); } static class SelectionSort implements Sort{ int numbers[]; SelectionSort(int [] numbers){ this.numbers = numbers; } @Override public void sort() { for (int j = 0; j < numbers.length-1; j++) { for (int i = j+1; i < numbers.length; i++) { if(numbers[i]<numbers[j]){ int temp = numbers[j]; numbers[j] = numbers[i]; numbers[i] = temp; } } } } @Override public int[] values() { // TODO Auto-generated method stub return numbers; } } static class BubblingSort implements Sort{ int numbers[]; BubblingSort(int [] numbers){ this.numbers = numbers; } @Override public void sort() { for (int j = 0; j < numbers.length; j++) { for (int i = 0; i < numbers.length-j-1; i++) { if(numbers[i]>numbers[i+1]){ int temp = numbers[i]; numbers[i] = numbers[i+1]; numbers[i+1] = temp; } } } } @Override public int[] values() { // TODO Auto-generated method stub return numbers; } } static class TreeSort implements Sort{ int numbers[]; Node n; TreeSort(int [] numbers){ n =new Node(); this.numbers = numbers; } @Override public void sort() { for (int i : numbers) { n.add(i); } } @Override public int[] values() { List<Object> list = n.values(); int sortedNumbers[] = new int[list.size()]; for (int i = 0; i < sortedNumbers.length; i++) { sortedNumbers[i] = Integer.parseInt(list.get(i).toString()); } return sortedNumbers; } } private static int[] performance(Sort algorithm, String type) { long start = System.currentTimeMillis(); algorithm.sort(); int sortedNumbers[] = algorithm.values(); long end = System.currentTimeMillis(); System.out.printf("%s排序,一共耗时 %d 毫秒%n",type,end-start); return sortedNumbers; } }


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2024-07-09 构建MyTree二叉树,同时与冒泡排序和选择排序的性能对比
虚心求学




性能比较结果: 测试次数50000次: Tree.InOrder 用时(ms):75 BubbleSort 用时(ms):6658 SelectSort 用时(ms):2214 冒泡排序与二叉树结果一致?:true 选择排序与二叉树结果一致?:true 冒泡排序与选择排序结果一致?:true 性能:二叉树 > 选择排序 > 冒泡排序
加载中
package j2se;

import java.util.ArrayList;
import java.util.List;

import charactor.Hero;

//自定义二叉树
public class MyTree<E> {
	public Node<E> root;
	private List<NodePair> pairs;

	public void add(E e) {
		if (root == null) {
			root = new Node<E>(e, 0);
		} else
			root.add(e, 1);

	}

	public void add(List<Hero> heros) {
		for (Hero hero : heros) {
			add(hero.hp, hero);
		}
	}

	public void add(Float key, Object obj) {
		if (root == null) {
			root = new Node<>(key, obj, 0);
		} else
			root.add(key, obj, 1);
	}

	public void add(E key, Object obj) {
		if (root == null) {
			root = new Node<E>(key, obj, 0);
		} else
			root.add(key, obj, 1);
	}

	public void add(E[] arr) {
		for (E e : arr) {
			add(e);
		}
	}

	public void print() {
		pairs = new ArrayList<NodePair>();
		print("Root", root, "\r\n", pairs);
		showList();
	}

	public void showList() {
		// Collections.sort(pairs,Comparator.comparingInt(p->p.Dimension));
		int[] count = new int[] { 0 };
		int Dimension = getDiemension(root, new int[] { 0 }, count);
		int margin = (int) ((Dimension - root.Dimension) * 1);
		String emString = "";
		for (int j = 0; j < margin; j++) {
			emString += " ";
		}
		int margin2 = margin * 3;
		String emString2 = "";
		for (int j = 0; j < margin2; j++) {
			emString2 += " ";
		}
		System.out.print(String.format("共%d个有效非空节点,%d层", count[0], Dimension + 1));
		System.out.print("树状图如下:\r\n");
		System.out.print(String.format("%s%.0f%n", emString2, root.Key));
		for (int i = 1; i <= Dimension; i++) {
			for (NodePair np : pairs) {
				if (np.Dimension != i)
					continue;
				margin = (int) ((Dimension - np.Dimension) * 1);
				if (i == 1)
					margin += 1;
				emString = " ";
				for (int j = 0; j < margin; j++) {
					emString += " ";
				}
				margin2 = (int) ((Dimension - np.Dimension) * 1) * 3;
				emString2 = " ";
				for (int j = 0; j < margin2; j++) {
					emString2 += " ";
				}

				String L = "□";
				String R = "□";
				if (np.L == 0 || np.L > Double.MIN_VALUE + 1e-12 && !np.IsNull)
					L = String.valueOf((Math.round(np.L * 100) / 100f));
				if (np.L == 0 || np.R > Double.MIN_VALUE + 1e-12 && !np.IsNull)
					R = String.valueOf((Math.round(np.R * 100) / 100f));
				if (np.IsNull) {

					np.R = np.L = Double.MIN_VALUE;
					L = "□";
					R = "□";
				}
				if (!(np.L == np.R && np.L <= Double.MIN_VALUE) && np.L != 0)
					System.out.print(String.format("%s%s %s%s%s", emString, L, emString2, R, emString));
			}
			System.out.println();
		}

	}

	public void print(String str1, Node<E> n, String str2, List<NodePair> nps) {
		if (n == null) {
			nps.add(new NodePair(n == null, nps.get(nps.size() - 1).Dimension + 1, 0, 0));
			return;
		}
		nps.add(new NodePair(n == null, n.Dimension + 1, n.Left == null ? Double.MIN_VALUE : n.Left.Key,
				n.Right == null ? Double.MIN_VALUE : n.Right.Key));
		System.out.print(String.format("第%d层:", n.Dimension));
		if (n.Obj != null)
			if (n.Obj instanceof Hero)
				System.out.print(String.format("object:%s;", (Hero) n.Obj));
		System.out.println(String.format("%s.value:%.2f%s", str1, n.Key, str2));
		String left = str1 + ".Left";
		print(left, n.Left, "", nps);
		String right = str1 + ".Right";
		print(right, n.Right, "", nps);

	}

	public int getDiemension(Node<E> node, int[] d, int[] c) {
		if (node == null)
			return d[0];
		c[0]++;
		d[0] = Math.max(node.Dimension, d[0]);
		if (node.Left != null)
			getDiemension(node.Left, d, c);
		if (node.Right != null)
			getDiemension(node.Right, d, c);
		return d[0];
	}

	public int getDimension() {
		return getDiemension(root, new int[] { 0 }, new int[] { 0 });
	}

	// 中序遍历
	public void inOrder() {
		order(root, OrderWay.inOrderWay);
	}

	private void order(Node<E> node, OrderWay orderWay) {
		if (node == null)
			return;
		if (orderWay == OrderWay.preOrderWay)
			node.print();
		if (node.Left != null)
			order(node.Left, orderWay);
		if (orderWay == OrderWay.inOrderWay)
			node.print();
		if (node.Right != null)
			order(node.Right, orderWay);
		if (orderWay == OrderWay.postOrderWay)
			node.print();
	}
	public List<Double> order(Node<E> node, OrderWay orderWay,List<Double>memoryList) {
		if (node == null)
			return null;
		if (orderWay == OrderWay.preOrderWay)
			memoryList.add(node.Key);
		if (node.Left != null)
			order(node.Left, orderWay,memoryList);
		if (orderWay == OrderWay.inOrderWay)
			memoryList.add(node.Key);
		if (node.Right != null)
			order(node.Right, orderWay,memoryList);
		if (orderWay == OrderWay.postOrderWay)
			memoryList.add(node.Key);
		
		return memoryList;
	}
	//每次遍历记录数据,返回链表形式
	public List<Double> orderDescending(Node<E> node, OrderWay orderWay,List<Double>memoryList) {
		if (node == null)
			return null;
		if (orderWay == OrderWay.preOrderWay)
			memoryList.add(node.Key);
		if (node.Right != null)
			orderDescending(node.Right, orderWay,memoryList);
		if (orderWay == OrderWay.inOrderWay)
			memoryList.add(node.Key);
		if (node.Left != null)
			orderDescending(node.Left, orderWay,memoryList);
		if (orderWay == OrderWay.postOrderWay)
			memoryList.add(node.Key);
		
		return memoryList;
	}

	// 前序遍历
	public void preOrder() {
		order(root, OrderWay.preOrderWay);
	}

	// 前序降序遍历
	public void preOrderDescending() {
		orderDescend(root, OrderWay.preOrderWay);
	}
	// 中序降序遍历
	public void inOrderDescending() {
		orderDescend(root, OrderWay.inOrderWay);
	}
	// 后序降序遍历
	public void postOrderDescending() {
		orderDescend(root, OrderWay.postOrderWay);
	}

	// 后续遍历
	public void postOrder() {
		order(root, OrderWay.postOrderWay);
	}
	
	private void orderDescend(Node<E> node, OrderWay orderWay) {
		if (node == null)
			return;
		if (orderWay == OrderWay.preOrderWay)
			node.print();
		if (node.Right != null)
			orderDescend(node.Right, orderWay);
		if (orderWay == OrderWay.inOrderWay)
			node.print();
		if (node.Left != null)
			orderDescend(node.Left, orderWay);
		if (orderWay == OrderWay.postOrderWay)
			node.print();
	}
}
//二叉树节点对,用于打印二叉树图
class NodePair {
	public boolean IsNull;
	public int Dimension;
	public double L = 4.9E-324;
	public double R = 4.9E-324;

	public NodePair(boolean isnull, int d, double L, double R) {
		IsNull = isnull;
		Dimension = d;
		this.L = L;
		this.R = R;
	}
}

//二叉树遍历方式
enum OrderWay {
	preOrderWay, inOrderWay, postOrderWay,
}

//二叉树节点
class Node<E> {
	public int Dimension;
	public double Key;
	public Object Obj;
	public Node<E> Left;
	public Node<E> Right;

	public Node(E e) {
		this.Key = E2Double(e);
	}

	public Node(E e, Object obj) {
		this(e);
		this.Obj = obj;
	}

	public Node(E e, int id) {
		this.Key = E2Double(e);
		this.Dimension = id;
	}

	public Node(E e, Object obj, int id) {
		this(e, obj);
		this.Dimension = id;
	}

	public Node(Float e, Object obj, int id) {
		Key = e;
		Obj = obj;
		this.Dimension = id;
	}

	private double E2Double(E e) {
		double value = Double.MIN_VALUE;
		if (e instanceof Number) {
			value = ((Number) e).doubleValue();
		}
		return value;
	}

	public void add(E e) {
		double value = E2Double(e);
		if (value <= this.Key) {
			if (this.Left != null)
				this.Left.add(e);
			else {
				this.Left = new Node<E>(e);
				return;
			}
		} else {
			if (this.Right != null)
				this.Right.add(e);
			else {
				this.Right = new Node<E>(e);
				return;
			}
		}

	}

	public void add(E e, Object obj, int d) {
		double value = E2Double(e);
		if (value <= this.Key) {
			if (this.Left != null)
				this.Left.add(e, obj, d + 1);
			else {
				this.Left = new Node<E>(e, obj, d);
				return;
			}
		} else {
			if (this.Right != null)
				this.Right.add(e, obj, d + 1);
			else {
				this.Right = new Node<E>(e, obj, d);
				return;
			}
		}
	}

	public void add(Float e, Object obj, int d) {
		double value = e;
		if (value <= this.Key) {
			if (this.Left != null)
				this.Left.add(e, obj, d + 1);
			else {
				this.Left = new Node<E>(e, obj, d);
				return;
			}
		} else {
			if (this.Right != null)
				this.Right.add(e, obj, d + 1);
			else {
				this.Right = new Node<E>(e, obj, d);
				return;
			}
		}
	}

	public void add(E e, int d) {
		double value = E2Double(e);
		if (value <= this.Key) {
			if (this.Left != null)
				this.Left.add(e, d + 1);
			else {
				this.Left = new Node<E>(e, d);
				return;
			}
		} else {
			if (this.Right != null)
				this.Right.add(e, d + 1);
			else {
				this.Right = new Node<E>(e, d);
				return;
			}
		}
	}

	public void print() {
		if (Obj == null)
			System.out.println(this.Key);
		else {
			if (Obj instanceof Hero) {
				System.out.println((Hero) Obj);
			}
		}
	}

}

------------------主方法调用测试-----------------------------
	public static void main(String[] args) throws IndexIsNagetiveException, IndexIsOutofRangeException {
		int number = 5 * 10000;
		System.out.println("测试次数"+number);
		int[] list = GetArrList(number);
		int[] list1 = getarr(list);
		int[] list2 = getarr(list);
		long startMs = System.currentTimeMillis();
		MyTree<Integer> mTree = GetMyTree(list);
		List<Double> treelist = mTree.orderDescending(mTree.root, OrderWay.inOrderWay, new ArrayList<>());
		long endMs = System.currentTimeMillis();
		long timeTree = endMs - startMs;
		System.out.println("Tree.InOrder 用时(ms):" + timeTree);
		long timeBub = BubbleSort(list1);
		System.out.println("BubbleSort 用时(ms):" + timeBub);
		long timeSelect = SelectSort(list2);
		System.out.println("SelectSort 用时(ms):" + timeSelect);
		System.out.println("冒泡排序与二叉树结果一致?:" + compareSortRes(list1, treelist));
		System.out.println("选择排序与二叉树结果一致?:" + compareSortRes(list2, treelist));
		System.out.println("冒泡排序与选择排序结果一致?:" + compareSortRes2(list2, list1));
		// mTree.print();
	}

	public static int[]getarr(int[]list)
	{
		int [] arr = new int[list.length];
		int index = 0;
		for (int i : list) {
			arr[index++] = i;
		}
		return arr;
	}

	public static boolean compareSortRes(int[] list, List<Double> list2) {
		int length = list.length;
		for (int i = 0; i < length; i++) {
			if (list[i] != (int) ((double) Math.floor(list2.get(i))))
				return false;
		}
		return true;
	}

	public static boolean compareSortRes2(int[] list, int[] list2) {
		int length = list.length;
		for (int i = 0; i < length; i++) {
			if (list[i] != list[i])
				return false;
		}
		return true;
	}

	public static MyTree<Integer> GetMyTree(int[] arr) {
		MyTree<Integer> mTree = new MyTree<>();
		for (int i : arr) {
			mTree.add(i);
		}
		return mTree;
	}

	public static int[] GetArrList(int Num) {
		int[] is = new int[Num];
		for (int i = 0; i < Num; i++) {
			is[i] = (int) (Math.random() * 1000);
		}
		return is;
	}

	public static long BubbleSort(int[] list) {
		long startMs = System.currentTimeMillis();
		int length = list.length;
		for (int i = 0; i < length - 1; i++) {
			for (int j = 0; j < length - 1 - i; j++) {
				if (list[j] < list[j + 1]) {
					int temp = list[j + 1];
					list[j + 1] = list[j];
					list[j] = temp;
				}
			}
		}
		long endMs = System.currentTimeMillis();
		return endMs - startMs;
	}

	public static long SelectSort(int[] list) {
		long startMs = System.currentTimeMillis();
		int length = list.length;
		for (int i = 0; i < length - 1; i++) {
			for (int j = i + 1; j < length; j++) {
				if (list[i] < list[j]) {
					int temp = list[j];
					list[j] = list[i];
					list[i] = temp;
				}
			}
		}
		long endMs = System.currentTimeMillis();
		return endMs - startMs;
	}

	public static void compListArr2Link() {
		List<Integer> list = new ArrayList<>();
		int n = 500 * 10000;
		System.out.println("测试次数:" + n);
		long time = testList(list, n);
		System.out.println("ArrayList执行Add用时(ms):" + time);
		list = new LinkedList<>();
		time = testList(list, n);
		System.out.println("LinkedList执行Add用时(ms):" + time);
	}

							


4 个答案

虚心求学
答案时间:2024-07-11
完整的二叉树,前序、中序、后序遍历的递归写法和非递归写法。 测试结果完全正确。

虚心求学
答案时间:2024-07-09
1.二叉树的中序遍历的递归写法和非递归写法的时间复杂度均为O(n); 2.而冒泡排序和选择排序的时间复杂度均为O(n^2); 因此 二叉树遍历的排序方法2.会比1.的方法快,而非递归的写法由于不用频繁递归调用函数,因此开销较小,实际效率会比非递归的写法稍高。

虚心求学
答案时间:2024-07-09
上面的测试,二叉树中序降序遍历是用递归写的,下面增加了非递归的方法并比较了递归和非递归的效率。 比较结果如下: 测试次数50000 Tree.InOrder(递归) 用时(ms):94 Tree.InOrder(非递归) 用时(ms):57 BubbleSort 用时(ms):6648 SelectSort 用时(ms):2433 冒泡排序与二叉树结果一致?:true 选择排序与二叉树结果一致?:true 冒泡排序与选择排序结果一致?:true 递归与非递归结果一致?:true 结论:非递归的写法性能更好

虚心求学
答案时间:2024-07-09
上面的测试,二叉树中序降序遍历是用递归写的,下面增加了非递归的方法并比较了递归和非递归的效率。 比较结果如下: 测试次数50000 Tree.InOrder(递归) 用时(ms):94 Tree.InOrder(非递归) 用时(ms):57 BubbleSort 用时(ms):6648 SelectSort 用时(ms):2433 冒泡排序与二叉树结果一致?:true 选择排序与二叉树结果一致?:true 冒泡排序与选择排序结果一致?:true 递归与非递归结果一致?:true 结论:非递归的写法性能更好



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2024-01-02 英雄BST排序
javanoobbbb




代码及截图如下所示
加载中
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class testBST {
    static class Hero{
        String name;
        int HP;

        public Hero(String name, int HP) {
            this.name = name;
            this.HP = HP;
        }

        @Override
        public String toString() {
            return "name: " + name  +
                    "HP: " + HP;
        }
    }

   static class btsTree{
        btsTree leftnode;
        btsTree rightnode;
        Hero myhero;
        void add(Object obj)
        {
            if (myhero==null)
            myhero=(Hero) obj;
            else
            {
                if (((Hero)obj).HP<=this.myhero.HP)
                {
                    if (this.leftnode==null)
                    {
                        leftnode=new btsTree();

                    }
                    leftnode.add(obj);
                }
                else
                {
                    if (this.rightnode==null)
                    {
                        rightnode=new btsTree();
                    }
                    rightnode.add(obj);
                }

            }

        }

        void LastNode()
        {
            if (this.myhero==null)
                return;
            if (this.rightnode!=null)
            {
                this.rightnode.LastNode();
            }
            System.out.println(this.myhero.toString());
            if (this.leftnode!=null)
            {
                this.leftnode.LastNode();
            }

        }


    }

    public static void  main(String[] args) {
        while (true) {
            int n=0;
            btsTree myBtsTree=new btsTree();
            Scanner input=new Scanner(System.in);
            System.out.print("请输入英雄数目:");
            n=input.nextInt();
            List<Hero> heroes=new ArrayList<>();
            for (int i = 0; i < n; i++) {
                heroes.add(new Hero("hero"+i,(int)(Math.random()*100)));
            }
            for (Hero hero:heroes)
            {
                myBtsTree.add(hero);
            }
            myBtsTree.LastNode();
        }
    }
}

							





回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2023-12-04 英雄二叉树
2023-09-23 练习-英雄二叉树
2022-09-22 快速排序是神


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 126 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 中级-集合框架-二叉树 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图