ZBLOG

#include using namespace std; #define MaxSize 100 typedef char ElemType; // 在此处补充你的代码 typedef struct tnode { ElemType data; struct tnode *lchild,*rchild; }BTNode; //建立二叉树 void CreateBTree(BTNode * &bt,char *str) //由括号表示串创建二叉链 { BTNod...

这段代码的问题在于没有正确处理输入数据和输出结果的部分。具体来说:

  1. 在创建二叉树时,应该将字符串作为函数参数传入,而不是使用 cin 输入。例如:CreateBTree(b, tree);
  2. 在显示结果时,没有换行符或其他分隔符来区分不同的输出。你可以在打印结果后添加一个换行符 cout << endl; 来使输出更清晰。

除此之外,代码中还存在一些潜在的问题:

  1. 代码中并未检查输入数据是否合法,在读取字符数组和处理字符时应该增加适当的判断条件。
  2. 没有对动态内存进行正确释放,在销毁二叉树时应使用 delete 关键字代替 free() 函数。

修复上述问题后,可以参考下面的修改版本:

#include <iostream>
using namespace std;

#define MaxSize 100
typedef char ElemType;
// 在此处补充你的代码
typedef struct tnode
{
	ElemType data;
	struct tnode *lchild, *rchild;
} BTNode;

//建立二叉树 
void CreateBTree(BTNode *&bt, const char *str) //由括号表示串创建二叉链
{
    BTNode *St[MaxSize], *p = NULL;
    int top = -1, k, j = 0;
    char ch;
    bt = NULL; //建立的二叉树初始时为空
    ch = str[j];
    while (ch != '\0') //str未扫描完时循环
    {
        switch (ch)
        {
        case '(':
            top++;
            St[top] = p;
            k = 1;
            break; //为左孩子结点
        case ')':
            top--;
            break;
        case ',':
            k = 2;
            break; //为右孩子结点
        default:
            p = new BTNode();
            p->data = ch;
            p->lchild = p->rchild = NULL;
            if (bt == NULL) //*p为二叉树的根结点
                bt = p;
            else //已建立二叉树根结点
            {
                switch (k)
                {
                case 1:
                    St[top]->lchild = p;
                    break;
                case 2:
                    St[top]->rchild = p;
                    break;
                }
            }
        }
        j++;
        ch = str[j];
    }
}

//销毁二叉树
void DestroyBTree(BTNode *&bt)
{
    if (bt != NULL)
    {
        DestroyBTree(bt->lchild);
        DestroyBTree(bt->rchild);
        delete bt;
    }
}

//以括号法表示法输出二叉树
void DispBTree(BTNode *bt)
{
    if (bt != NULL)
    {
        cout << bt->data;
        if (bt->lchild != NULL || bt->rchild != NULL)
        {
            cout << "(";
            DispBTree(bt->lchild);
            
			if (bt->rchild != NULL) 
				cout << ",";
				
			DispBTree(bt->rchild);
            cout << ")";
        }
    }
}

void FindParent(BTNode *bt, char x, BTNode *&p)
{
    if (bt != NULL)
    {
        if (bt->data == x)
            p = NULL;
        else if (bt->lchild != NULL && bt->lchild->data == x)
            p = bt;
        else if (bt->rchild != NULL && bt->rchild->data == x)
            p = bt;
        else
        {
            FindParent(bt->lchild, x, p);
            if (p == NULL)
                FindParent(bt->rchild, x, p);
        }
    }
    else
        p = NULL;
}

void display(BTNode *bt, char x)
{
    BTNode *p;
    FindParent(bt, x, p);
    if (p != NULL)
    {
        cout << p->data;
		cout << endl; // 输出换行符
	}
}

int main()
{
    BTNode *b, *p;
    char tree[MaxSize];
    
	cin.getline(tree, MaxSize); // 通过 getline 获取一行字符串
    
	CreateBTree(b, tree);
	
	char k;
	cin >> k;

	display(b,k);

	DestroyBTree(b);

	return 0;
}

希望以上回答能帮助到你!如果还有其他问题,请随时提问。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9541

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?