Java实现二叉树

树的三种遍历顺序

先序遍历

先序遍历的顺序就是先依次访问每颗子树的根节点,然后再依次访问左子树和右子树,即根左右。以下图为例,先序遍历的输出次序就是 A,B,D,C,E,F

image-20221117085350089

中序遍历

中序遍历是先依次访问每颗子树的左孩子节点,然后访问子树的根节点,最后访问子树的右孩子节点,即左根右。以下图为例,中序遍历的输出次序就是 D,B,A,E,F,C

image-20221117085350089

后序遍历

后序遍历是先依次访问每颗子树的左孩子节点,然后访问子树的右孩子节点,最后访问根节点,即左右根。以下图为例,后续遍历的输出次序就是D,B,F,E,C,A

image-20221117085350089

代码实现

节点类

在这里,我们使用链式存储来实现二叉树,二叉树中的节点包含 数据域指针域,数据域用于存放数据,指针域用于指向当前节点的左右孩子节点。Java代码如下:

//二叉树中的节点数据
public class TreeNode {
	private Object data; //数据域
	private TreeNode lChild; //左孩子
	private TreeNode rChild; //有孩子

	public TreeNode(Object data) {
		this.data = data;
	}

	public TreeNode(){}

	public void setLChild(TreeNode lChild) {
		this.lChild = lChild;
	}

	public void setRChild(TreeNode rChild) {
		this.rChild = rChild;
	}

	public void setData(Object data) {
		this.data = data;
	}

	public TreeNode getLChild() {
		return this.lChild;
	}

	public TreeNode getRChild() {
		return this.rChild;
	}

	public Object getData() {
		return this.data;
	}
}

二叉树的构建和遍历

定义一个新的类 BinaryTree,用来表示一颗二叉树,并在该类中编写关于二叉树的操作方法。

//一个BinaryTree对象就为一棵二叉树
public class BinaryTree {

	//根节点
	public TreeNode root = new TreeNode();

	//接收用户输入
	Scanner sc = new Scanner(System.in);

	//构建一个二叉树
    /*
    	实现思路:
	    	1.接收用户输入,只要其不为#,就将其赋值给当前节点,并通过递归生成其左子树和右子树
	    	2.如果用户输入#号,就代表当前节点为空,回溯到上一层递归去构建左子树/右子树
    */
	public TreeNode build(TreeNode treeNode){

		Object data = sc.next();
		TreeNode newTreeNode = null;

		//如果输入#,表示当前节点为空,开始回溯到上一级调用
		if(data.equals("#")) {
			treeNode = null;
		} else {
			//如果输入的不是#,就通过遍历构建二叉树的左子树
			//并且把输入的值设置到当前节点
			treeNode.setData(data);
			newTreeNode = new TreeNode();
			treeNode.setLChild(build(newTreeNode));
			//构建二叉树的右子树
			newTreeNode = new TreeNode();
			treeNode.setRChild(build(newTreeNode));
		}

		//返回当前节点
		return treeNode;
	}

	//先序遍历
	public void preOrder(TreeNode treeNode) {
		if(treeNode != null) {
			System.out.print(treeNode.getData() + "\t"); //访问根节点
			preOrder(treeNode.getLChild()); //递归遍历左子树
			preOrder(treeNode.getRChild()); //递归遍历右子树
		}
	}

	//中序遍历
	public void midOrder(TreeNode treeNode) {
		if(treeNode != null) {
			midOrder(treeNode.getLChild());
			System.out.print(treeNode.getData() + "\t");
			midOrder(treeNode.getRChild());
		}
	}

    //后序遍历
	public void postOrder(TreeNode treeNode) {
		if(treeNode != null) {
			postOrder(treeNode.getLChild());
			postOrder(treeNode.getRChild());
			System.out.print(treeNode.getData() + "\t");
		}
	}
}

测试

编写一个新的类,在主方法中测试

package cn.hypig.tree;

import java.util.*;

public class BinaryTreeDemo{
	public static void main(String[] args) {
		BinaryTree tree = new BinaryTree();
		tree.build(tree.root);
		System.out.println("----------先序遍历----------");
		tree.preOrder(tree.root);
		System.out.println("\n----------中序遍历----------");
		tree.midOrder(tree.root);
		System.out.println("\n----------后序遍历----------");
		tree.postOrder(tree.root);
	}
}

测试结果

输入:

image-20221117091440912

输出

image-20221117091602189

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小嵌_

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值