根据先序中序序列求后序序列

package BinaryTree;

import java.util.Scanner;

public class PreMidTree {

	private static StringBuilder sb = new StringBuilder();
	public static void calTree(int[] pre, int[] mid) {

		if (mid.length == 0)
			return;
		if (mid.length == 1) {
			sb.append(mid[0] + " ");
			return;
		}
		int middle = 0;
		for (int i = 0; i < mid.length; i++) {
			if (mid[i] == pre[0]) {
				middle = i;
			}
		}

		int[] leftMid = new int[middle];
		int[] leftPre = new int[middle];

		for (int i = 0; i < middle; i++) {
			leftMid[i] = mid[i];
			leftPre[i] = pre[i + 1];
		}

		int[] rightMid = new int[mid.length - middle - 1];
		int[] rightPre = new int[mid.length - middle - 1];

		for (int i = 0; i < mid.length - middle - 1; i++) {
			rightMid[i] = mid[i + middle + 1];
			rightPre[i] = pre[i + middle + 1];
		}
		calTree(leftPre, leftMid);
		calTree(rightPre, rightMid);
		sb.append(pre[0] + " ");		
	}

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int[] pre = { 4, 1, 3, 2, 6, 5, 7 };
		int[] mid = { 1, 2, 3, 4, 5, 6, 7 };
		calTree(pre, mid);
		System.out.println(sb.toString().trim());
	}
}

好的,针对您的问题,可以序列和中序列还原成二叉树,然后再得到后序序列。下面是实现的步骤和代码: 步骤: 1. 从序列中取出第一个元素作为根节点; 2. 在中序列到根节点的位置,将中序列分成两部分,左边部分为左子树的中序列,右边部分为右子树的中序列; 3. 由左子树的中序列,可以得到左子树的序列(即序列中根节点后面相邻的元素); 4. 由左子树的序列和中序列,递归构造左子树; 5. 由右子树的中序列,可以得到右子树的序列(即序列中根节点后面不相邻的元素); 6. 由右子树的序列和中序列,递归构造右子树; 7. 最终得到的二叉树,对其进行后序遍历,即可得到后序序列。 代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> void post_order(char* pre, char* in, int len) { if (len <= 0) { return; } char root = pre[0]; int root_idx = 0; while (root_idx < len && in[root_idx] != root) { root_idx++; } post_order(pre + 1, in, root_idx); post_order(pre + root_idx + 1, in + root_idx + 1, len - root_idx - 1); printf("%c ", root); } int main() { char pre[] = "GDAFEMHZ"; char in[] = "ADEFGHMZ"; int len = strlen(pre); printf("The post order sequence is: "); post_order(pre, in, len); printf("\n"); return 0; } ``` 输出结果: ```c The post order sequence is: AEFDHZMG ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

算法小生Đ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值