设有一棵满二叉树(所有结点值均不同),已知其先序序列为pre,设计一个算法求其后序序列post。

设有一棵满二叉树(所有结点值均不同),已知其先序序列为pre,设计一个算法求其后序序列post。_第1张图片

void PreToPost(ElemType pre, int l1, int h1, ElemType &post, int l2, int h2) {
	int half;
	if (h1 >= l1) {
		post[h2] = pre[l1];//表示后序序列的最后一个结点(根结点)等于先序序列的第一个结点(根结点)
		half = (h1 - l1) / 2;
		PreToPost(pre, l1 + 1, l1 + half, post, l2, l2 + half - 1);//转换左子树
		PreToPost(pre, l1 + half + 1, h1, post, l2 + half, h2 - 1);//转换右子树
	}
}

推导思路:

设有一棵满二叉树(所有结点值均不同),已知其先序序列为pre,设计一个算法求其后序序列post。_第2张图片

设有一棵满二叉树(所有结点值均不同),已知其先序序列为pre,设计一个算法求其后序序列post。_第3张图片

C语言完整代码:

#include
#include
#include
#include
using namespace std;

#define MaxSize 100
typedef string ElemType;

/*
	设有一棵满二叉树(所有结点值均不同),已知其先序序列为pre,设计一个算法求其后序序列post
	对于一般二叉树,仅根据先序或后序序列,不能确定另一个遍历序列。但对满二叉树,任意一个结点
	的左、右子树均含有相等的结点数,同时,先序序列的第一个结点作为后序序列的最后一个结点,
	由此得到将先序序列[l1...h1]转换为后序序列post[l2...h2]的递归模型如下:
	f(pre,l1,h1,post,l2,h2) = 不做任何事情            h1= l1) {
		post[h2] = pre[l1];//表示后序序列的最后一个结点(根结点)等于先序序列的第一个结点(根结点)
		half = (h1 - l1) / 2;
		PreToPost(pre, l1 + 1, l1 + half, post, l2, l2 + half - 1);//转换左子树
		PreToPost(pre, l1 + half + 1, h1, post, l2 + half, h2 - 1);//转换右子树
	}
}


int main() {
	//pre是先序序列
	ElemType pre = "ABDECFG";
	//ElemType pre = "ABCDEFG";
	int len = pre.length(); 

	//post是后序序列
	//ElemType post = "#######";
	ElemType post = (char*) malloc(sizeof(char)*len);
	PreToPost(pre,0, len-1, post,0, len-1);
	printf("后序序列:");
	for (int i = 0; i < len; i++){
		printf("%c ", post[i]);
	}
	printf("\n");
}

实验结果:

设有一棵满二叉树(所有结点值均不同),已知其先序序列为pre,设计一个算法求其后序序列post。_第4张图片设有一棵满二叉树(所有结点值均不同),已知其先序序列为pre,设计一个算法求其后序序列post。_第5张图片

过程推演是小编的想法,如有不对的地方,欢迎指正,我将继续制作出更加有质量的博客内容,希望个位小伙伴能够点个赞,这是对我的付出的肯定,谢谢您们!!! 

你可能感兴趣的:(C++,数据结构,算法,数据结构)