南阳 oj 重建二叉树 题目756



#include <stdio.h>

#include <malloc.h>

#include <string.h>

//二叉链表

typedef struct node{

char data;//节点数据元素

struct node *lchild;//指向左孩子

struct node *rchild;//指向右孩子

}BiNode,*BTree;

//利用后序和中序建立二叉树

void GetPreOrder(char *last,char *mid,BTree &T,int len)

{

if(len==0)

{

T = NULL;

return;

}

//取出后序序列中的最后一个节点

char ch=last[len-1];

int index=0;

//在中序序列中进行查找根节点,并用index记录其在序列中的索引

while(mid[index]!=ch)

{

index++;

}

//给根节点分配空间

T=(BTree)malloc(sizeof(BiNode));

T->data=mid[index];

//建立左子树

GetPreOrder(last,mid,T->lchild,index);

//建立右子树

GetPreOrder(last+index,mid+index+1,T->rchild,len-index-1);

}

//利用先序和中序求后序

void GetPostOrder(char *prim,char *mid,BTree &T,int len)

{

if(len==0)

{

T=NULL;

return;

}

//提出先序序列中的第一个节点

char ch=prim[0];

int index=0;

//在中序序列中查找当前根节点,并用index记录其在序列中的位置

while(mid[index]!=ch)

{

index++;

}

//给根节点分配空间

T=(BTree)malloc(sizeof(BiNode));

T->data=mid[index];

//建立左子树

GetPostOrder(prim+1,mid,T->lchild,index);

//建立右子树

GetPostOrder(prim+index+1,mid+index+1,T->rchild,len-index-1);

}

//先序输出二叉树

void PreOrder(BTree T)

{

if(T!=NULL)

{

printf("%c",T->data);

PreOrder(T->lchild);

PreOrder(T->rchild);

}

}

//后序输出二叉树

void PostOrder(BTree T)

{

if(T!=NULL)

{

PostOrder(T->lchild);

PostOrder(T->rchild);

printf("%c",T->data);

}

}

int main()

{

char first[26],mid[26],last[26];

while(scanf("%s%s",last,mid)!=EOF)

{

BTree T=NULL;

GetPreOrder(last,mid,T,strlen(last));

PreOrder(T);

//   GetPostOrder(last,mid,T,strlen(last));

//   PostOrder(T);

printf("\n");

}

return 0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-24 23:31:31

南阳 oj 重建二叉树 题目756的相关文章

南阳OJ-756 重建二叉树(二叉树的中序遍历和后序遍历求先序遍历)

重建二叉树 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于100组),以文件结尾结束.每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法). 输出 每组输出数据单独占一行,输出对应得先序序列. 样例输入 ACBFGED ABCDEFG CDAB CBAD 样例输出 DBACEGF BCAD二

南阳oj A+BproblemII 题目103

 和HDUOJ上的一模一样  就找搬过来了 #include<stdio.h> #include<string.h> #define N 1000 char x[N],y[N]; int a[N+1]; int main() { int g,h=0; scanf("%d",&g); while(g--) { int k1,k2,t=0,m,n,k,i,j,l; scanf("%s %s",x,y); k1=strlen(x); k

南阳oj Registration system 题目991

 #include<stdio.h> #include<stdlib.h> #include<string.h> char a[105][1000];//二维数组模拟  就OK int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",a[i]); int num=0; for(int j=0;j<i;j++) { if(j!

南阳oj 小猴子下落 题目63

 #include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> #include<math.h> #include<stdlib.h> using namespace std; int main() { int d, I; while(scanf("%d%d",&d,&I)&&(d+I))

南阳oj 求次数 题目1112

 /* 求次数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 题意很简单,给一个数n 以及一个字符串str,区间[i,i+n-1] 为一个新的字符串,i 属于[0,strlen(str)]如果新的字符串出现过ans++,例如:acmacm n=3,那么 子串为acm cma mac acm ,只有acm出现过 求ans; 输入LINE 1: T组数据(T<10) LINE 2: n ,n <= 10,且小于strlen(str); LINE 3:str st

题目六:重建二叉树

/////////////////////////////////////////////////////////////////////////////////////// // // 9.题目六:重建二叉树 // 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出改二叉树 struct BinaryTreeNode { int m_iValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; BinaryTreeNode(int i

剑指offer 重建二叉树

重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回 思路:首先找到root,然后递归的重建root -> left,root -> right. /** * Definition for binary tree * struct TreeNode { * int val; * TreeNod

《剑指offer》— JavaScript(4)重建二叉树

重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 实现代码 function reConstructBinaryTree(pre, vin) { if(!pre || pre.length===0){ return; } var root={ val:pre[0] }; for(var i

重建二叉树-剑指Offer

重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路 先序遍历的第一个节点是中序遍历的根节点 从中序遍历中找先序遍历的那个根节点,然后切开左右子树,用递归函数分别构造左右子树 代码 public class Solution04 { // 重建二叉树 public TreeNode re