java语言实现二叉树

  1. 创建一个类,这个类中有根、数值、左孩子、右孩子;
  2. 数据可以通过数组赋值给树结构中的值,所以可以加一个链表级别的数据域,存放每个节点的数据;
  3. 给节点填值;
  • 代码

public class TreeFirst {

	private Object value; //单个数据
	private TreeFirst leftChild;  //做孩子
	private TreeFirst rightChild; //右孩子
	public  TreeFirst root;
	public  List<TreeFirst> datas;
	
	public TreeFirst(TreeFirst leftChild, TreeFirst rightChild, Object value) {
		this.leftChild = leftChild;
		this.rightChild = rightChild;
		this.value = value;
	}
	
	public TreeFirst() {
	}

	public TreeFirst(Object value) {
		this.value = value;
	}
	
	//创建一棵树
	public void createBinTree(Object[] objs) {
		datas = new ArrayList<TreeFirst>();
		for (Object object : objs) {
			datas.add(new TreeFirst(object));  //将一个数组装入一个列表中;
		}
		//将第一个数值赋给根
		root = datas.get(0);

		for(int i = 0; i < datas.size()/2; i++) {
			datas.get(i).leftChild = datas.get(2*i+1);
			System.out.print(datas.get(i).leftChild.value + " ");
			if(2*i+2 < datas.size()) {  //因为列表中的第一个元素给了根,所以需要考虑
				datas.get(i).rightChild = datas.get(2*i+2);
				System.out.print(datas.get(i).rightChild.value + " ");
			}
		}
		
	}

    public static void main(String[] args) {
		Object[] objs = {1,2,3,4,5,6,7,8,9,10,11};
		TreeFirst first = new TreeFirst();
		first.createBinTree(objs);
}

结果:

2 3 4 5 6 7 8 9 10 11 

datas.get(i).rightChild = datas.get(2*i+2); 这行代码看起来挺难理解的,刚才我也在想这个是怎么回事,后来我想了一个接近于正确说法的答案:datas.get(i)是给每一个根节点赋值,例如,1作为根节点,2与3都是1的左右孩子,抛去1根节点,从1的左孩子节点与右孩子节点分别是datas的第0和1个节点,这也是递归。上述顺序是按照层级铺展的顺序给每个节点填值的。这就算创建了一个节点值了,明天有时间写三种遍历方法~

好好学习,不要让任何人打乱你的节奏~

<think>嗯,用户想要用Java实现二叉树的前序、中序、后序和层次遍历的示例代码。首先,我需要回忆一下这几种遍历方式的区别以及它们的实现方法。 根据引用中的信息,层次遍历通常用队列来实现,而前序、中序、后序多用栈或递归。前三种遍历属于深度优先搜索,层次遍历是广度优先搜索。那用户可能希望看到递归和迭代两种方法,不过问题里主要提到示例代码,可能先提供递归的实现更简单。 首先,定义二叉树节点的结构。Java中通常用一个类,包含数据、左子节点和右子节点。然后,前序遍历是根-左-右,中序是左-根-右,后序是左-右-根。层次遍历则是按层,用队列来辅助。 接下来,代码结构。先写节点类TreeNode,然后创建遍历方法。前中后序用递归实现比较直观,层次遍历用队列,如引用[1]和[2]提到的。需要确保代码正确,比如递归的终止条件,队列的循环处理。 可能需要注意的地方:递归方法在空节点时返回,层次遍历需要处理每一层的节点,可能需要记录每层的大小。但示例代码可能不需要太复杂,简单的队列实现即可。 然后,按照用户的要求,每个遍历方法都要有示例代码。例如前序遍历递归函数,中序和后序类似。层次遍历使用队列,循环取出节点并加入左右子节点。 测试部分,构建一个示例二叉树,比如引用中的例子,层次遍历序列1 2 3 4 5 6这样的结构。例如根节点是1,左子2,右子3,然后2的左子4,右子5,3的左子6。然后调用各个遍历方法,输出结果是否符合预期。 需要确保代码正确,语法正确。比如Java中队列可以用LinkedList实现,注意添加子节点前检查是否为空。 最后,生成相关问题,可能涉及遍历的应用、不同方法的比较、迭代方式实现等。根据引用中的内容,比如引用[4]提到根据前序和中序求后序,所以相关问题可以包括如何根据遍历结果重建二叉树。 总结步骤:定义TreeNode类,实现四种遍历方法(递归前中后序,队列层次遍历),编写main方法测试,输出结果,然后提出问题。</think>以下是Java实现二叉树四种遍历方式的示例代码,结合递归和队列实现: ### 二叉树节点定义 ```java class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } ``` ### 前序遍历(根-左-右) 递归实现: ```java public static void preOrder(TreeNode root) { if (root == null) return; System.out.print(root.val + " "); preOrder(root.left); preOrder(root.right); } ``` ### 中序遍历(左-根-右) 递归实现: ```java public static void inOrder(TreeNode root) { if (root == null) return; inOrder(root.left); System.out.print(root.val + " "); inOrder(root.right); } ``` ### 后序遍历(左-右-根) 递归实现: ```java public static void postOrder(TreeNode root) { if (root == null) return; postOrder(root.left); postOrder(root.right); System.out.print(root.val + " "); } ``` ### 层次遍历(按层输出) 队列实现(引用[1][2]): ```java public static void levelOrder(TreeNode root) { if (root == null) return; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { TreeNode node = queue.poll(); System.out.print(node.val + " "); if (node.left != null) queue.offer(node.left); if (node.right != null) queue.offer(node.right); } } ``` ### 测试示例 ```java public static void main(String[] args) { // 构建示例二叉树 TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.left = new TreeNode(4); root.left.right = new TreeNode(5); root.right.left = new TreeNode(6); System.out.print("前序遍历:"); preOrder(root); // 输出:1 2 4 5 3 6 System.out.print("\n中序遍历:"); inOrder(root); // 输出:4 2 5 1 6 3 System.out.print("\n后序遍历:"); postOrder(root); // 输出:4 5 2 6 3 1 System.out.print("\n层次遍历:"); levelOrder(root);// 输出:1 2 3 4 5 6 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值