当前位置:编程学习 > C/C++ >>

NYOJ221 Tree

题目分析:
还是那样,作为一个二逼青年,我首先想到的还是定义一个NODE的结构体,然后建立树,然后.......可是,你有没有想过字符串的感受啊~~也许,你经常忽视的人可能会给你最好的东西。废话不多说,尽管是二逼青年的想法,也要说出来嘛~都有表达想法的权利是不?
PS:咳咳~~有没有觉得楼主分析题目的语言诙谐幽默,小自恋一下啦~~~
OK,进入正题。对于树的操作,最简单的肯定是递归啦。重建树的步骤:
1、前序遍历的第一个节点是根节点。
2、在中序遍历中找到这个根节点,然后把中序遍历的字符串分成了左串和右串,也就是该根节点的左子树和右子树。
3、OK,递归下去就可以了,递归的出口就是root后面的节点个数小于等于0.3、OK,递归下去就可以了,递归的出口就是root后面的节点个数小于等于0.
忘了说了,这里为了避免在Rebuild里面不断的申请空间和过后不断的释放空间,预先定义了一个node数组。因为最多自由26个节点,所以内存可以重复使用。
按理这果断不是GC,因为妹纸我马上要给出另一种方法。搞定之后再发啦~直接基于字符串处理的方法
[cpp]
#include<stdio.h>  
#include<string.h>  
struct NODE 

    char ch; 
    NODE *Left; 
    NODE *Right; 
}; 
const int N = 27; 
NODE node[N]; 
NODE *stack[N]; 
int num; 
void Rebuild(char *PreStr, char *InStr, int nLen, NODE **root) 

    if(nLen <= 0) 
        return; 
    if((*root) == NULL) 
    { 
        node[++num].ch = PreStr[0]; 
        (*root) = &node[num]; 
    } 
    else 
        (*root)->ch = PreStr[0]; 
    if(nLen == 1) 
        return; 
    int i; 
    for(i = 0; i < nLen; ++i) 
    { 
        if(PreStr[0] == InStr[i]) 
            break; 
    } 
    Rebuild(&PreStr[1], &InStr[0], i, &(*root)->Left); 
    Rebuild(&PreStr[i + 1], &InStr[i + 1], nLen - i - 1, &(*root)->Right); 

void Post(NODE *root) 

    if(!root) 
        return; 
    Post(root->Left); 
    Post(root->Right); 
    printf("%c",root->ch); 

int main() 

    char PreStr[27]; 
    char InStr[27]; 
    NODE *root; 
    int nLen; 
    while(scanf("%s %s", PreStr, InStr) != EOF) 
    { 
        root = NULL; 
        nLen = strlen(PreStr); 
        memset(node, 0 ,sizeof(node)); 
        num = -1; 
        Rebuild(PreStr, InStr, nLen, &root); 
        Post(&node[0]); 
        printf("\n"); 
    } 
    return 0; 

#include<stdio.h>
#include<string.h>
struct NODE
{
 char ch;
 NODE *Left;
 NODE *Right;
};
const int N = 27;
NODE node[N];
NODE *stack[N];
int num;
void Rebuild(char *PreStr, char *InStr, int nLen, NODE **root)
{
 if(nLen <= 0)
  return;
 if((*root) == NULL)
 {
  node[++num].ch = PreStr[0];
  (*root) = &node[num];
 }
 else
  (*root)->ch = PreStr[0];
 if(nLen == 1)
  return;
 int i;
 for(i = 0; i < nLen; ++i)
 {
  if(PreStr[0] == InStr[i])
   break;
 }
 Rebuild(&PreStr[1], &InStr[0], i, &(*root)->Left);
 Rebuild(&PreStr[i + 1], &InStr[i + 1], nLen - i - 1, &(*root)->Right);
}
void Post(NODE *root)
{
 if(!root)
  return;
 Post(root->Left);
 Post(root->Right);
 printf("%c",root->ch);
}
int main()
{
 char PreStr[27];
 char InStr[27];
 NODE *root;
 int nLen;
 while(scanf("%s %s", PreStr, InStr) != EOF)
 {
  root = NULL;
  nLen = strlen(PreStr);
  memset(node, 0 ,sizeof(node));
  num = -1;
  Rebuild(PreStr, InStr, nLen, &root);
  Post(&node[0]);
  printf("\n");
 }
 return 0;
}


 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,