java数据结构之二叉树的小球游戏

本文介绍了一种使用Java生成二叉树并进行遍历的方法。通过递归方式生成了固定深度的二叉树,并实现了先序、中序和后序遍历,同时包含了一个小球路径模拟的功能,展示了二叉树的动态特性。

代码实现:

import java.util.Scanner;

public class erChaShu {
	private static int MAX_LEVEL;
	public static void main(String[] args) {
//		Node1<Integer> tree = new Node1();
		//输入具体的数值控制树的深度
		Scanner set = new Scanner(System.in);
		int n = set.nextInt();
//		tree.setValue(1);//将值加入节点中
//		
//		Node1<Integer> n = new Node1();
//		n.setValue(2);
//		tree.setLeft(n);
//		
//		n = new Node1();
//		n.setValue(3);
//		tree.setRight(n);
//		
//		n = new Node1();
//		n.setValue(4);
//		tree.getLeft().setLeft(n);
//		
//		n = new Node1();
//		n.setValue(5);
//		tree.getLeft().setRight(n);
		Node1<Integer> tree = geterNode1();
		for (int i = 0; i < n; i++) {
			System.out.println("第"+i+"个小球的路径");
			walk(tree);
		}
	}
	//设置小球开关并往下走
	private static void walk(Node1<Integer> node) {
		if (node.getSwitcher() == 0) {
			walk(node.getLeft());
			node.setSwitcher(1);
		}else {
			walk(node.getRight());
			node.setSwitcher(0);
		}
	}
	//先序遍历
	private static void preOrder(Node1<Integer> tree) {
		if (tree == null) {
			return;
		}
		System.out.println(tree.getValue()+"");
		preOrder(tree.getLeft());
		preOrder(tree.getRight());
		
	}
	//中序遍历
	private static void inOrder(Node1<Integer> tree) {
		if (tree ==null) {
			return;
		}
		preOrder(tree.getLeft());
		System.out.println(tree.getValue()+"");
		preOrder(tree.getRight());
	}
	//后序遍历
	private static void posOrder(Node1<Integer> tree) {
		if (tree == null) {
			return;
		}
		preOrder(tree.getLeft());
		preOrder(tree.getRight());
		System.out.println(tree.getValue()+"");
	}
	
	//创造根节点
	private static Node1<Integer> geterNode1() {
		Node1<Integer> node = new Node1<Integer>();
		//将根节点的值设为1
		node.setValue(1);
		//传参到下一个方法生成左右子节点
		generaNode1(2,node);
		return node;
	}
	private static void generaNode1(int level,Node1<Integer> parent){
		//如果节点的数目超过4层则迭代停止
		if (level > 4) {
			return;
		}
			int value = parent.getValue();
			Node1<Integer> node = new Node1<Integer>();
			//巡回找左孩子
			node.setValue(value * 2);
			parent.setLeft(node);
			
			node = new Node1<>();
			//巡回找右孩子
			node.setValue(value * 2 + 1);
			parent.setRight(node);
			
			//再生成下一层节点
			generaNode1(level + 1, parent.getLeft());
			generaNode1(level + 1, parent.getRight());
		
		
	}

}
class Node1<T>{
	private T value;//节点的值
	private int switcher;//小球通过的开关,0表示开关关闭,1表示开关打开
	//设置左右节点
	private Node1<T> left;
	private Node1<T> right;
	public Node1<T> getLeft() {
		return left;
	}
	public void setLeft(Node1<T> left) {
		this.left = left;
	}
	public Node1<T> getRight() {
		return right;
	}
	public void setRight(Node1<T> right) {
		this.right = right;
	}
	
	public T getValue() {
		return value;
	}
	public void setValue(T value) {
		this.value = value;
	}
	public int getSwitcher() {
		return switcher;
	}
	public void setSwitcher(int switcher) {
		this.switcher = switcher;
	}
	
	
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ctrl精

面试很多问题,积攒不容易

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值