zoukankan      html  css  js  c++  java
  • UVa 二叉树重建(先序+中序求后序)

    题意是给出先序和中序,求出后序。

    先序遍历先访问根结点,通过根结点可以在中序中把序列分为左子树部分和右子树部分,我建了一个栈,因为后序遍历最后访问根结点,所以把每次访问的根结点放入栈中。因为后序遍历先是左子树然后是右子树,所以在递归的时候就先递归右子树,然后继续递归左子树。

    写完程序后有个错误,找了很久才发现,就是我原本在计算左子树个数的时候,是这样计算的,pre2=mid-pre,但是当pre>mid时,就不对了。而正确计算左子树的方法应该是下面这样的。

     1 #include<iostream>
     2 #include<cstring>
     3 #include<stack>
     4 using namespace std;
     5 
     6 char t1[30], t2[30];
     7 stack<char>map;
     8 int length;
     9 
    10 void solve(int pre, int mid, int len)
    11 {
    12     map.push(t1[pre]);
    13     int i = mid;
    14     while (t2[mid] != t1[pre]) mid++;             //在中序序列中找到与前序序列相同的结点
    15     int pre2 = mid - i;                            //左子树的数量
    16     int mid2 = len - 1 - pre2;                     //右子树的数量
    17     if (mid2 >= 1)                                 
    18         solve(pre + pre2 + 1, mid + 1, mid2);
    19     if (pre2 >= 1)
    20         solve(pre + 1, mid - pre2, pre2);
    21 }
    22 
    23 
    24 int main()
    25 {
    26     while (cin >> t1 >> t2)
    27     {
    28         length = strlen(t1);
    29         solve(0, 0, length);
    30         while (!map.empty())
    31         {
    32             char s = map.top();
    33             cout << s;
    34             map.pop();
    35         }
    36         cout << endl;
    37     }
    38     return 0;
    39 }

     后来数据结构实验的时候也要写这么的一个算法,主要部分就是

     1 bintree buildBintree(char *pre, char *mid,int length)
     2 {
     3     int lch,rch;
     4     bintree root;
     5     root=(bintree)malloc(sizeof(binnode));
     6     lch=0;
     7     root->data=*pre;
     8     while(*mid!=*pre)  {mid++;lch++;}
     9     rch=length-1-lch;
    10     if(rch>=1) root->rchild=buildBintree(pre+lch+1,mid+1,rch);
    11     else root->rchild=NULL;
    12     if(lch>=1) root->lchild=buildBintree(pre+1,mid-lch,lch);
    13     else root->lchild=NULL;
    14     return root;
    15 }

    一开始没加11和13语句,然后就不对,看来这个指针问题得好好注意一下。

  • 相关阅读:
    mybatis动态拼接条件的技巧 where 1=1 或者where标签
    cron表达式
    java获取电脑mac物理地址
    js 正则表达式:价格的校验
    java 当前时间月份
    中文保存在properties乱码的解决
    java 手机号码+邮箱的验证
    27.openpyxl 向指定单元格添加图片并修改图片大小 以及修改单元格行高列宽
    26.python操作Excel
    25.xlrd、xlwt和openpyxl模块的比较和使用
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6185394.html
Copyright © 2011-2022 走看看