鱼C论坛

 找回密码
 立即注册
查看: 409|回复: 4

给定非空二叉树的中根序列和后根序列,请编写程序创建该二叉树,计算其高度和先根...

[复制链接]
发表于 2023-11-20 19:23:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
#include <cstring>
#include<math.h>
using namespace std;

struct node {
    char data;
    node* left;
    node* right;
};

typedef node* tree;

int find_(char* inorder, int size, char data) {
    for (int i = 0; i < size; i++) {
        if (inorder[i] == data)
            return i;
    }
    return -1;
}

node* buildtree(char* postorder, char* inorder, int n) {
    if (n <= 0)
        return NULL;
    char tdata = postorder[n - 1];
    int k = find_(inorder, n, tdata);
    if(k==-1)
    {
        return NULL;
    }
    node* root = new node;
    root->data = tdata;
    root->left = buildtree(&postorder[0], &inorder[0], k);
    root->right = buildtree(&postorder[k], &inorder[k+1], n - k - 1);
    return root;
}

int get_height(tree t) {
    if (t == NULL)
        return -1;
   
    int d1 = get_height(t->left);
    int d2 = get_height(t->right);
    return max(d1, d2) + 1;
}

void Preorder(tree t) {
    if (t == NULL)
        return;
   
    cout << t->data;
    Preorder(t->left);
    Preorder(t->right);
}

int main() {
    char postorder[10000];
    char inorder[10000];
    while (scanf("%s", postorder) != EOF && scanf("%s", inorder) != EOF) {
        int n = strlen(inorder);
        tree root = buildtree(postorder, inorder, n);
        int height = get_height(root);
        if(root==NULL) cout<<"INVALID"<<endl;
        else
        {
        cout << height << endl;
        Preorder(root);
        cout << endl;
        }
    }
    return 0;
}感觉在递归的时候如果k==-1就要返回上一级而不是直接结束函数,导致一些不合法的输入,还会输出一些字符,该如何修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-20 19:23:50 | 显示全部楼层
你需要在递归的时候,当  k==-1  时返回上一级,而不是直接结束函数。这样可以避免输出一些不合法的字符。你可以修改  buildtree  函数中的条件判断,如下所示:

  1. node* buildtree(char* postorder, char* inorder, int n) {
  2.     if (n <= 0)
  3.         return NULL;
  4.     char tdata = postorder[n - 1];
  5.     int k = find_(inorder, n, tdata);
  6.     if(k==-1)
  7.     {
  8.         return NULL;
  9.     }
  10.     node* root = new node;
  11.     root->data = tdata;
  12.     root->left = buildtree(&postorder[0], &inorder[0], k);
  13.     if(root->left == NULL) // 如果左子树为空,返回上一级
  14.     {
  15.         delete root;
  16.         return NULL;
  17.     }
  18.     root->right = buildtree(&postorder[k], &inorder[k+1], n - k - 1);
  19.     if(root->right == NULL) // 如果右子树为空,返回上一级
  20.     {
  21.         delete root;
  22.         return NULL;
  23.     }
  24.     return root;
  25. }
复制代码


通过在递归的过程中加入对左右子树是否为空的判断,可以避免输出不合法的字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-20 19:25:18 | 显示全部楼层
在当前的代码中,当 k == -1 时,会直接返回 NULL,导致递归函数结束。为了在遇到不合法的输入时返回上一级,你可以在递归函数中添加一个判断条件,如果 k == -1 则返回上一级。

以下是修改后的代码片段:
  1. node* buildtree(char* postorder, char* inorder, int n) {
  2.     if (n <= 0)
  3.         return NULL;
  4.    
  5.     char tdata = postorder[n - 1];
  6.     int k = find_(inorder, n, tdata);
  7.     if(k == -1) {
  8.         return NULL;
  9.     }
  10.    
  11.     node* root = new node;
  12.     root->data = tdata;
  13.     root->left = buildtree(&postorder[0], &inorder[0], k);
  14.     if (root->left == NULL) {
  15.         // 非法输入,返回上一级
  16.         delete root;
  17.         return NULL;
  18.     }
  19.     root->right = buildtree(&postorder[k], &inorder[k+1], n - k - 1);
  20.     if (root->right == NULL) {
  21.         // 非法输入,返回上一级
  22.         delete root->left;
  23.         delete root;
  24.         return NULL;
  25.     }
  26.    
  27.     return root;
  28. }
复制代码

请注意,当发现左子树或右子树为空时,我们将删除已创建的节点并返回 NULL,以确保整个树的结构正确。

希望这可以解决你的问题。如果还有其他疑问,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-20 19:44:19 | 显示全部楼层
Mike_python小 发表于 2023-11-20 19:25
在当前的代码中,当 k == -1 时,会直接返回 NULL,导致递归函数结束。为了在遇到不合法的输入时返回上一级 ...

但是走到左分支左后不是一定要指向NULL
CBEDFAGH
CEFDBHGA
我说的错误是类似于这种然后输出INVALID
现在代码输出2
HFDGA
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-14 20:29:25 | 显示全部楼层
申谭 发表于 2023-11-20 19:44
但是走到左分支左后不是一定要指向NULL
CBEDFAGH
CEFDBHGA

我也在思考这个问题,楼主有想法了吗,抛掷异常更容易出现问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 15:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表