1. 程式人生 > >通過中序遍歷、後序遍歷求先序遍歷

通過中序遍歷、後序遍歷求先序遍歷

 用上圖二叉樹作為一個例子

中序遍歷:8 4 9 2 10 5 1 6 3 7

後序遍歷:8 9 4 10 5 2 6 7 3 1


1.首先我們通過後序遍歷尋找整顆二叉樹的根結點,由於後序遍歷的特點為  “左右根 ”,所以後邊遍歷的最後一個值便是根節點的值,根節點值為1

2.由於中序遍歷的特點為“左根右”,我們知道了根節點後,便可以推出根節點的左子樹與右子樹

3.在左子樹中遞迴剛才的過程

4.在右子樹中遞迴剛才的過程


所以在上圖樹中,我們先找到了根節點為1,然後左子樹中序遍歷為8 4 9 2 10 5  ,左子樹後序遍歷為 8 9 4 10 5 2,我們又找到了左子樹的根節點為2,然後左子樹的左子樹中序遍歷便為8 4 9……(以此類推,遞迴演算法)


通過中序遍歷、後序遍歷 輸出先序遍歷,下面的程式碼在解決過程中未建立二叉樹。

#include<stdio.h>
#include<stdlib.h>
void fun(char*inorder, char*postorder, int length)
{
	if (length == 0)
		return;
	int rootindex = 0;
	for (; rootindex < length; rootindex++)
		if (inorder[rootindex] == postorder[length - 1])
			break;
	printf("%c", inorder[rootindex]);
	fun(inorder, postorder, rootindex);
	fun(inorder + rootindex+1, postorder+rootindex, length - rootindex-1);
}

int main()
{
	int length;
	printf("請輸入二叉樹的結點數:");
	scanf("%d",&length);
	getchar();
	char*Inordertree;//中序
	char *Postordertree;//後序
	Inordertree = (char*)malloc(length*sizeof(char));
	Postordertree = (char*)malloc(length*sizeof(char));
	int i;
	printf("請輸入二叉樹的中序遍歷(回車結束)");
	for (i = 0; i < length; i++)
		scanf("%c",&Inordertree[i]);
	getchar();
	printf("請輸入二叉樹的後序遍歷(回車結束)");
	for (i = 0; i < length; i++)
		scanf("%c",&Postordertree[i]);
	getchar();
	printf("二叉樹的先序遍歷為:");
	fun(Inordertree, Postordertree, length);
	printf("\n");
	system("pause");
	return 0;
}


效果展示(10用A代替)




通過先序遍歷、中序遍歷求後序遍歷 方法與此類似。


如果希望建立二叉樹,那麼上述方法可以給你提供一點點小思路~