根据先序遍历和中序遍历推后序遍历C语言

事实上,一个中序遍历的算法中入栈的过程中,如果你把每个入栈的结点保存起来,你会发现这些结点就是先序遍历的结果,同样,出栈就是中序遍历,如下图
在这里插入图片描述

  • 核心算法
    在这里插入图片描述
    先序遍历的第一个结点一定是根结点,也是后序遍历的最后一个结点,找到它在中序中的位置 i ,那么 i 的左边就是左子树,右边是右子树,递归的求解左右两边
  • 代码
#include <stdio.h>
#include <stdlib.h>
#define SIZE 6
//
int pre[6]={1,2,3,4,5,6};//先序遍历数组 
int in[6]={3,2,4,1,6,5};//中序遍历 数组 
int post[6]={0};//后序遍历数组 
void CreatePost(int first,int mid,int last,int n)
{
	printf("------%d-------\n",first);
	if(n==0){
		return;	
	}
	if(n==1)
	{
		post[last]=pre[first];
		return;
	}
	int root=pre[first];
	post[last+n-1]=root;
	int i;
	for(i=0;i<6;i++)
	{
		if(root==in[i+mid])
			break;
	}
	int L=i;
	int R=n-L-1;
	CreatePost(first+1,mid,last,L);
	CreatePost(first+L+1,mid+L+1,last+L,R);
	
}
int main(int argc, char** argv) {
	CreatePost(0,0,0,6);
	
	for(int i=0;i<6;i++)
		printf("%d ",post[i]);
	return 0;
}

以下是使用C语言实现先序遍历中序遍历后序遍历创建二叉树的示例代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 根据先序遍历中序遍历创建二叉树 TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) { if (preorderSize == 0 || inorderSize == 0) { return NULL; } // 创建根节点 TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = preorder[0]; root->left = NULL; root->right = NULL; // 在中序遍历中找到根节点位置 int i = 0; while (inorder[i] != root->val) { i++; } // 递归创建左子树和右子树 root->left = buildTree(preorder + 1, i, inorder, i); root->right = buildTree(preorder + i + 1, preorderSize - i - 1, inorder + i + 1, inorderSize - i - 1); return root; } // 后序遍历二叉树 void postorderTraversal(TreeNode* root) { if (root == NULL) { return; } postorderTraversal(root->left); postorderTraversal(root->right); printf("%d ", root->val); } int main() { int preorder[] = {1, 2, 4, 5, 3, 6, 7}; int inorder[] = {4, 2, 5, 1, 6, 3, 7}; int size = sizeof(preorder) / sizeof(preorder[0]); TreeNode* root = buildTree(preorder, size, inorder, size); printf("后序遍历结果:"); postorderTraversal(root); printf("\n"); return 0; } ``` 运行结果: ``` 后序遍历结果:4 5 2 6 7 3 1 ``` 代码中先定义了一个 `TreeNode` 结构体,表示二叉树的节点。`buildTree` 函数根据先序遍历中序遍历创建二叉树,先创建根节点,然后在中序遍历中找到根节点位置,递归创建左子树和右子树。 `postorderTraversal` 函数是后序遍历二叉树的实现,先遍历左子树,再遍历右子树,最后访问根节点并输出节点值。 在 `main` 函数中,定义了两个数组,分别表示先序遍历中序遍历的结果。`buildTree` 函数创建二叉树,`postorderTraversal` 函数后序遍历二叉树并输出结果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值