7-23 还原二叉树

7-23 还原二叉树
分数 25
作者 DS课程组
单位 浙江大学
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。

输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。

输出格式:
输出为一个整数,即该二叉树的高度。

输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
自己的:

#include<stdio.h>
#include<stdlib.h>
typedef struct tree{
    char data;
    struct tree* left;
    struct tree* right;
}tree,*link;
link creat(char pre[],char inorder[],int n);
int get(link root);
int main(){
    int n;
    char pre[55];
    char inorder[55];
    scanf("%d",&n);
    getchar();
    scanf("%s",pre);
    scanf("%s",inorder);
//   	gets(pre);
//   	gets(inorder);

   // puts(pre);
    //puts(inorder);
    link root =( link)malloc(sizeof(tree));
    root=creat(pre,inorder,n);
    int ans=get(root);
    printf("%d",ans);
	 
}
link creat(char pre[],char inorder[],int n){
	if(n==0){
		return NULL;
	}
	link root= (link)malloc(sizeof(tree));

	int index;//根节点在中序遍历中的位置 
	for(int i=0;i<n;i++){
		if(pre[0]==inorder[i]){
			index=i;
			break;
		}
	}
	root->data=pre[0];
	//printf("%c\n",root->data);
	root->left=creat(pre+1,inorder,index);
	root->right=creat(pre+index+1,inorder+index+1,n-index-1); 
	return root;
}
int get(link root){
	if(root==NULL){
		return 0;
	}
	int m=get(root->left);
	int n=get(root->right);
	return m>n?m+1:n+1;
}

抄的:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct tree{
	char data;
	struct tree *left,*right;
}Tree;
//先序第一个确定根节点,中序在根节点左边全是左子树,右边全是右子树 
Tree *creat(char pre[],char mid[],int n)//分别传入先序序列,中序序列,剩余元素的个数
{
	if(n==0)return NULL;
	Tree *t=(Tree*)malloc(sizeof(Tree)); 
	int index=0;
	while(index<n)
	{
		if(mid[index]==pre[0])break;
		index++;
	}
	
	t->data=pre[0];//根节点
	t->left=creat(pre+1,mid,index);//左边确定左子树 
	t->right=creat(pre+index+1,mid+index+1,n-index-1); //右边确定右子树
	return t; 
 } 
int getH(Tree *T)
{
	if(!T)return 0;
	
	int lefth=getH(T->left);
	int righth=getH(T->right);
	
	return lefth>righth?++lefth:++righth;
}
int main()
{	
	int N,HIGH;
	char pre[55],mid[55];
	scanf("%d",&N);
	getchar();
	gets(pre);
	gets(mid);
	Tree *T=creat(pre,mid,N);
	HIGH=getH(T); 
	printf("%d",HIGH);
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
还原叉树是指根据二叉树的前序遍历和中序遍历结果,重建出原二叉树的过程。实现这个过程的关键是找到二叉树的根节点,然后再根据根节点将左子树和右子树递归地还原。 首先,我们需要定义一个二叉树节点的类,包含节点值、左孩子节点和右孩子节点的属性。接下来,我们可以使用递归的方法来还原叉树。 我们可以利用前序遍历的结果,找到二叉树的根节点。前序遍历结果的第一个元素就是根节点的值。然后,我们可以在中序遍历结果中找到根节点的位置,将中序遍历结果分为左子树和右子树的部分。 接下来,对于根节点的左子树,我们可以用前序遍历结果和中序遍历结果的左子树部分递归地还原左子树。同理,对于根节点的右子树,我们可以用前序遍历结果和中序遍历结果的右子树部分递归地还原右子树。 最后,我们将根节点的左子树和右子树连接到根节点上,就可以得到还原后的二叉树。 下面是一个简单的Python代码实现还原叉树的过程: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(preorder, inorder): if not preorder or not inorder: return None # 根据前序遍历结果找到根节点 root_val = preorder[0] root = TreeNode(root_val) # 在中序遍历结果中找到根节点的位置,将左子树和右子树分开 root_index = inorder.index(root_val) left_inorder = inorder[:root_index] right_inorder = inorder[root_index+1:] # 递归还原左子树和右子树 left_preorder = preorder[1:1+len(left_inorder)] right_preorder = preorder[1+len(left_inorder):] root.left = buildTree(left_preorder, left_inorder) root.right = buildTree(right_preorder, right_inorder) return root # 测试 preorder = [1, 2, 4, 5, 3, 6, 7] inorder = [4, 2, 5, 1, 6, 3, 7] root = buildTree(preorder, inorder) ``` 以上是还原叉树的简单实现。这个方法的时间复杂度为O(n),其中n是二叉树节点的个数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超好的小白

没体验过打赏,能让我体验一次吗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值