还原二叉树(C语言实现)

在这里插入图片描述
就把这个题目当作建树的练手题了
代码如下

#include<stdio.h>
#include<malloc.h>
typedef struct node{
	char data;
	struct node* left;
	struct node* right;
}Treenode,*NodeP;
char Pre[51],Mid[51];
int Position(char data,char Mid[],int n); 
 
NodeP Insert(NodeP root,char data,int n)
{
	if(!root){//建立根节点 
		NodeP a = (NodeP)malloc(sizeof(Treenode));
		a->data = data;
		a->left = a->right = NULL;
		root = a;
	}else{
		int Pos1 = Position(root->data,Mid,n);//当前根节点在中序序列中的位置 
		int Pos2 = Position(data,Mid,n);//新插入结点在中序序列中的位置 
		if(Pos2 < Pos1){//结点位于左子树 
			if(root->left){//当左子树不为空 
				root->left = Insert(root->left,data,n);
			}else{//当左子树为空直接插入 
				NodeP a = (NodeP)malloc(sizeof(Treenode));
				a->data = data;
				a->left = a->right = NULL;
				root->left = a;
			}
		}else{//结点位于右子树 
			if(root->right){//当右子树不为空
				root->right = Insert(root->right,data,n); 
			}else{//当右子树为空直接插入 
				NodeP a = (NodeP)malloc(sizeof(Treenode));
				a->data = data;
				a->left = a->right = NULL;
				root->right = a;
			}
		}
	}
	return root;
}
int Position(char data,char Mid[],int n)
{
	for(int i = 0;i < n;i++){
		if(data == Mid[i])
			return i;//这是先序序列中元素在中序序列中的位置 
	}
}
int GetHeight(NodeP root){
	int MaxH, HR, HL;
    if(root) {
        HL = GetHeight(root->left);
        HR = GetHeight(root->right);
        MaxH = (HL>HR)?HL:HR;
        return MaxH+1;
    }
    return 0;
}
int main()
{
	int n;
	scanf("%d",&n);
	
	scanf("%s",&Pre);
	scanf("%s",&Mid);
	NodeP root = NULL;
	for(int i = 0;i < n;i++)
		root = Insert(root,Pre[i],n);
	printf("%d",GetHeight(root));
}

①题示字符串的输入呢,一开始使用的是gets();但是总是报错,后来改用%s的scanf输入就可以了
②然后就是根据先序和中序序列建树,大体思路是这样
首先先序是 根->左->右,中序是 左->根->右
那么在先序序列中先找到整棵树的根结点,也就是A
那么接下来,通过观察B在中序遍历序列中相对于A的位置,就可以知道B是A的左孩子还是右孩子中,接着找对位置插入即可。例如在中序序列中,B在A的左侧,那么B就是A的左孩子,建立新结点插入B即可。
转化成程序呢,位置就可以通过数组中数组下标的大小来判断,新插入的结点通过递归判断插入位置即可
③最后是返回树高的函数GetHeight();
这个函数要记住,也是通过递归实现,基本思想就是选出左右子树中最高的那一枝作为树的高度输出,将为NULL的结点作为递归出口,其他不为空的结点继续调用函数;递归层数的增加也就可以通过 return MaxH+1;中的+1记录为高度的增加
结果如下

在这里插入图片描述
不要再将if判断条件中的’==‘写成’='了… T_T(这种bug是真难找)

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值