树的遍历_构造后序【学习笔记】

本文介绍如何根据前序和中序遍历结果构造二叉树,并通过递归方式实现后序遍历。探讨了直接输出遍历结果的方法,避免实际构建二叉树带来的开销。

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

例一:根据前序中序构造二叉树

在这里插入图片描述


突破口:

前序遍历第一个就是树根。

把问题的规模缩小:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后:

初始值(空传or单节点的树)
进行递归调用【数学归纳法+递推关系】


public static void main(String[] args)
	{
		TreeCreator creator = new TreeCreator();
		TreeTraversal traversal = new TreeTraversal();

		TreeNode sampleTree = creator.createSampleTree();

		// 先序遍历
		traversal.preOrder(sampleTree);
		System.out.println();

		// 中序遍历
		traversal.inOrder(sampleTree);
		System.out.println();

		// 后序遍历
		traversal.postOrder(sampleTree);
		System.out.println();

		System.out.println("======");
		TreeNode tree = creator.createTree("ABDEGCF", "DBGEACF");
		traversal.postOrder(tree);// 后序遍历
		System.out.println();
		// 边界值测试
		traversal.postOrder(creator.createTree("", ""));// 空树
		System.out.println();
		traversal.postOrder(creator.createTree("A", "A"));// 单结点
		System.out.println();
		traversal.postOrder(creator.createTree("AB", "BA"));// 把树根放到最后,看1 + rootIndex是否越界
		System.out.println();
	}

输出结果:

在这里插入图片描述


思考:

有必要把树真的建起来吗?能不能直接输出?

注意:

初始值和递推关系都要写对!

public String postOrder(String preOrder, String inOrder)
	{
		// 处理特殊情况
		if (preOrder.isEmpty())// 空传——>空树:没有结点
		{
			return "";
		}

		// 前序遍历的第一个点:根(A)
		char rootValue = preOrder.charAt(0);// 拿出第一个字符:根的value
		// 从中序遍历中寻找根(A);找到后,切分左右
		int rootIndex = inOrder.indexOf(rootValue);
		// 知道左子树的长度(从中序那里看)
		// int leftSize = rootIndex;

		return
		// 先后序遍历左子树,返回左子树后序遍历的序列
		postOrder(preOrder.substring(1, 1 + rootIndex), inOrder.substring(0, rootIndex)) +
		// + 右子树后序遍历的序列
				postOrder(preOrder.substring(1 + rootIndex), inOrder.substring(1 + rootIndex)) + rootValue;

	}

public static void main(String[] args)
	{
		TreeCreator creator = new TreeCreator();
		TreeTraversal traversal = new TreeTraversal();

		System.out.println("Sample tree traversal");
		TreeNode sampleTree = creator.createSampleTree();
		// 先序遍历
		traversal.preOrder(sampleTree);
		System.out.println();

		// 中序遍历
		traversal.inOrder(sampleTree);
		System.out.println();

		// 后序遍历
		traversal.postOrder(sampleTree);
		System.out.println();

		System.out.println("====================================");
		System.out.println("Creating tree from preOrder and inOrder");
		TreeNode tree = creator.createTree("ABDEGCF", "DBGEACF");
		traversal.postOrder(tree);// 后序遍历
		System.out.println();
		// 边界值测试
		traversal.postOrder(creator.createTree("", ""));// 空树
		System.out.println();
		traversal.postOrder(creator.createTree("A", "A"));// 单结点
		System.out.println();
		traversal.postOrder(creator.createTree("AB", "BA"));// 把树根放到最后,看1 + rootIndex是否越界
		System.out.println();

		System.out.println("====================================");
		System.out.println("Generating postOrder directly");
		System.out.println(traversal.postOrder("ABDEGCF", "DBGEACF"));
		System.out.println(traversal.postOrder("", ""));
		System.out.println(traversal.postOrder("A", "A"));
		System.out.println(traversal.postOrder("AB", "BA"));
	}

输出结果:

在这里插入图片描述


总结:

在这里插入图片描述
找到递推关系比从0开始构造要简单很多。

实现的过程:
把递推关系写成递归函数。


完整代码在这里哦!

CheeseCheese-IScream
给个小星星鼓励一下吧~❤谢谢❤

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值