根据二叉树前序、中序遍历求出后续遍历

本文介绍了一种根据二叉树的前序和中序遍历结果,重构并完成后续遍历的方法。通过递归算法,文章详细解释了如何定位根节点,构建左右子树,并最终实现整棵树的遍历过程。

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

/**
 * TreeNode
 *
 * @author VicterTian
 * @version V1.0
 * @Date 2019/2/8
 */
class TreeNode {
	int data;
	TreeNode left;
	TreeNode right;

	public TreeNode() {
	}

	TreeNode(int data) {
		this.data = data;
		this.left = null;
		this.right = null;
	}
}

/**
 * 根据二叉树前序、中序遍历求出后续遍历
 *
 * @author VicterTian
 * @version V1.0
 * @Date 2019/2/8
 */
public class BinaryTree {
	private TreeNode root;

	private BinaryTree() {
		this.root = null;
	}

	private void initTree(int[] preOrder, int[] inOrder) {
		this.root = this.initTree(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1);
	}

	private TreeNode initTree(int[] preOrder, int start1, int end1, int[] inOrder, int start2, int end2) {
		if (start1 > end1 || start2 > end2) {
			return null;
		}
		int rootData = preOrder[start1];
		TreeNode head = new TreeNode(rootData);
		// 找到根节点所在位置
		int rootIndex = findIndexInArray(inOrder, rootData, start2, end2);
		int offSet = rootIndex - start2 - 1;
		// 构建左子树
		TreeNode left = initTree(preOrder, start1 + 1, start1 + 1 + offSet, inOrder, start2, start2 + offSet);
		// 构建右子树
		TreeNode right = initTree(preOrder, start1 + offSet + 2, end1, inOrder, rootIndex + 1, end2);
		head.left = left;
		head.right = right;
		return head;
	}

	private int findIndexInArray(int[] a, int x, int begin, int end) {
		for (int i = begin; i <= end; i++) {
			if (a[i] == x) {
				return i;
			}
		}
		return -1;
	}

	private void postOrder() {
		this.postOrder(this.root);
	}

	private void postOrder(TreeNode localRoot) {
		if (localRoot != null) {
			postOrder(localRoot.left);
			postOrder(localRoot.right);
			System.out.print(localRoot.data + "   ");
		}
	}

	public static void main(String[] args) {
		BinaryTree binaryTree = new BinaryTree();
		int[] preOrder = {1, 2, 4, 8, 9, 5, 10, 3, 6, 7};
		int[] inOrder = {8, 4, 9, 2, 10, 5, 1, 6, 3, 7};
		binaryTree.initTree(preOrder, inOrder);
		System.out.println("二叉树的后续遍历");
		binaryTree.postOrder();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值