二叉树的创建和遍历方法(下)

本文详细介绍了如何使用链表形式存储二叉树,并通过提供前序、中序和后序遍历的实现代码,展示了二叉树在链表中的操作便利性。同时,通过实例演示了如何根据原始数据构建二叉树并输出不同遍历结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树除了可以使用一维数组存储,还可以使用链表形式。使用链表的好处是对节点的增删很容易实现。可以定义两个类:节点类TreeNode和二叉树类BinaryTree。BinaryTree类包含根节点以及添加节点的方法addNode(int value),TreeNode类包含成员value以及其左右子节点。这样,在创建二叉树时,所有节点之间的关系便确定了。以下为实现代码

import java.util.*;
public class BinaryTreeLink {
	public static ArrayList<TreeNode> cachePre = new ArrayList<>();//存储前序遍历结果
	public static ArrayList<TreeNode> cacheIn = new ArrayList<>();//存储中序遍历结果
	public static ArrayList<TreeNode> cachePost = new ArrayList<>();//存储后序遍历结果
	public static void main(String[] args){
		int[] data = {6, 3, 5, 9, 7, 8, 4, 2};
		BinaryTree tree = new BinaryTree(data);
		preOrder(tree.rootNode);
		inOrder(tree.rootNode);
		postOrder(tree.rootNode);
		System.out.println("The initial data: ");
		for(int i:data){
			System.out.print(i+" ");
		}
		System.out.println();
		System.out.println("前序遍历:");
		for(TreeNode i:cachePre){
			System.out.print(i.value+" ");
		}
		System.out.println();
		System.out.println("中序遍历:");
		for(TreeNode i:cacheIn){
			System.out.print(i.value+" ");
		}
		System.out.println();
		System.out.println("后序遍历:");
		for(TreeNode i:cachePost){
			System.out.print(i.value+" ");
		}
		System.out.println();
	}
	public static void preOrder(TreeNode node){//前序遍历
		if(node!=null){
			cachePre.add(node);
			preOrder(node.leftNode);
			preOrder(node.rightNode);
		}
	}
	public static void inOrder(TreeNode node){//中序遍历
		if(node!=null){
			inOrder(node.leftNode);
			cacheIn.add(node);
			inOrder(node.rightNode);
		}
	}
	public static void postOrder(TreeNode node){//后序遍历
		if(node!=null){
			postOrder(node.leftNode);
			postOrder(node.rightNode);
			cachePost.add(node);
		}
	}
}

class TreeNode{//节点类
	int value;
	TreeNode leftNode;
	TreeNode rightNode;
	public TreeNode(int value){
		this.value = value;
		this.leftNode = null;
		this.rightNode = null;
	}
}

class BinaryTree{//二叉树类
	public TreeNode rootNode;
	public BinaryTree(int[] data){//根据原始数据,添加树节点
		for(int i:data){
			addNode(i);
		}
	}
	public void addNode(int value){//添加树节点遵循左小右大的原则
		if(rootNode==null){rootNode = new TreeNode(value);return;}
		TreeNode currentNode = rootNode;
		while(true){
			if(value>currentNode.value){
				if(currentNode.rightNode==null){currentNode.rightNode = new TreeNode(value);return;}
				currentNode = currentNode.rightNode;
			}
			else{
				if(currentNode.leftNode==null){currentNode.leftNode = new TreeNode(value);return;}
				currentNode = currentNode.leftNode;
			}
		}		
	}
}

输出:

The initial data: 
6 3 5 9 7 8 4 2 
前序遍历:
6 3 2 5 4 9 7 8 
中序遍历:
2 3 4 5 6 7 8 9 
后序遍历:
2 4 5 3 8 7 9 6 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值