已知先序+中序构造二叉树,已知后序+中序构造二叉树(C语言)

代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef struct Bitree{
	char data;
	struct Bitree *lchild;
	struct Bitree *rchild;
}Bitree,*Bi;
void PreOrder(Bitree *p);
void MidOrder(Bitree *p);
void PostOrder(Bitree *p);
void print(Bitree *Troot);

void midprecreat(Bi &Node,char mid[],char pre[],int lm,int rm,int lp,int rp)
{//中序加先序创建 
	Node=(Bi)malloc(sizeof(Bitree));
	Node->data=pre[lp];
	Node->lchild=NULL;
	Node->rchild=NULL;
	
	int pos=lm;
	
	while(mid[pos]!=pre[lp])
		pos++;
	int childlen=pos-lm;//用来控制子树在字符串中的范围 
	if(pos>lm)//有左子树,递归创建 
		midprecreat(Node->lchild,mid,pre,lm,pos-1,lp+1,lp+childlen);
	if(pos<rm)//有右子树,递创建
		midprecreat(Node->rchild,mid,pre,pos+1,rm,lp+childlen+1,rp);
}

void midpostcreat(Bi &Node,char mid[],char post[],int lm,int rm,int lp,int rp)
{//中序+后序创建 
	Node=(Bi)malloc(sizeof(Bitree));
	Node->data=post[rp];
	Node->lchild=NULL;
	Node->rchild=NULL;
	
	int pos=lm;
	
	while(mid[pos]!=post[rp])
		pos++;
	int childlen=pos-lm;//用来控制子树在字符串中的范围 
	if(pos>lm)//有左子树,递归创建 
		midpostcreat(Node->lchild,mid,post,lm,pos-1,lp,lp+childlen-1);
	if(pos<rm)//有右子树,递创建
		midpostcreat(Node->rchild,mid,post,pos+1,rm,lp+childlen,rp-1);
}
int main()
{
	char	pre[100];            //存储先序序列  
    char    mid[100];            //存储中序序列  
    char    post[100];           //存储后序序列  
	int n;
	Bitree *Troot;
	printf("程序1请输入节点个数\n");
	scanf("%d",&n);	getchar();
	printf("输入二叉树的中序与先序序列,求后序序列\n");
	gets(mid);
    gets(pre);
    midprecreat(Troot,mid,pre,0,n-1,0,n-1);
    print(Troot);
    
    printf("程序2 请输入节点个数\n");
	scanf("%d",&n);	getchar();
	printf("输入二叉树的中序与后序序列,求先序序列\n");
	gets(mid);
    gets(post);
    midpostcreat(Troot,mid,post,0,n-1,0,n-1);
    print(Troot);
	return 0;
}

void print(Bitree *Troot)
{
	printf("先序遍历结果:\n");
    PreOrder(Troot);
    printf("\n");
  
    printf("中序遍历结果:\n");
    MidOrder(Troot);  
    printf("\n");
  
    printf("后序遍历结果:\n");
    PostOrder(Troot);  
    printf("\n");  
}

//先序遍历  
void PreOrder(Bitree *p)  
{  
       if(p != NULL)  
       {  
              printf("%c ",p->data);         //输出该结点  
              PreOrder(p->lchild);  //遍历左子树   
              PreOrder(p->rchild); //遍历右子树  
       }  
}  
  
//中序遍历  
void MidOrder(Bitree *p)  
{  
       if(p != NULL)  
       {  
              MidOrder(p->lchild);   //遍历左子树   
              printf("%c ",p->data);     //输出该结点  
              MidOrder(p->rchild);  //遍历右子树  
       }  
}  

//后序遍历  
void PostOrder(Bitree *p)  
{  
       if(p != NULL)  
       {  
              PostOrder(p->lchild);  //遍历左子树   
              PostOrder(p->rchild); //遍历右子树  
              printf("%c ",p->data);     //输出该结点  
       }  
}  


  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
同样可以通过递归方式来构建二叉树,下面是 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; } int rootVal = preorder[0]; TreeNode* root = (TreeNode*) malloc(sizeof(TreeNode)); root->val = rootVal; root->left = NULL; root->right = NULL; int pos; for (pos = 0; pos < inorderSize; pos++) { if (inorder[pos] == rootVal) { break; } } int leftInorderSize = pos; int rightInorderSize = inorderSize - pos - 1; int* leftPreorder = preorder + 1; int* rightPreorder = preorder + leftInorderSize + 1; int* leftInorder = inorder; int* rightInorder = inorder + pos + 1; root->left = buildTree(leftPreorder, leftInorderSize, leftInorder, leftInorderSize); root->right = buildTree(rightPreorder, rightInorderSize, rightInorder, rightInorderSize); return root; } void inorderTraversal(TreeNode* root) { if (root == NULL) { return; } inorderTraversal(root->left); printf("%d ", root->val); inorderTraversal(root->right); } 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); inorderTraversal(root); return 0; } ``` 上面的代码中,`buildTree` 函数就是用于构建二叉树函数,其中 `preorder` 和 `inorder` 分别表示先序遍历和中序遍历的结果,`preorderSize` 和 `inorderSize` 则是对应结果数组的大小。函数首先判断结果数组是否为空,若为空则返回 `NULL`。接着,函数取出 `preorder` 中的第一个值作为根节点的值,然后在 `inorder` 中找到该值所在的位置 `pos`。根据中序遍历的特点,`inorder` 中 `pos` 左边的节点都在左子树中,`pos` 右边的节点都在右子树中。因此,可以将 `preorder` 和 `inorder` 分别划分成左子树和右子树的部分,然后递归构建左子树和右子树。函数返回构建好的根节点。 最后,可以使用 `inorderTraversal` 函数对构建好的二叉树进行中序遍历,以验证构建结果是否正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值