为什么会报这种错?

m0_53664180 2021-04-28 11:27:28


// 二叉树.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include<iostream>
using namespace std;

typedef struct BiTNode
{
char data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;

void InitBiTree(BiTree& T)
{
char c;
cin >> c;
if (c == '#')
T = NULL;
else
{
T = new BiTNode;
T->data = c;
InitBiTree(T->lchild);
InitBiTree(T->rchild);
}
}

void PreOrderTravel1(BiTree T)
{
if (T)
{
cout << T->data;
PreOrderTravel1(T->lchild);
PreOrderTravel1(T->rchild);
}
}
//中序
void InOrderTravel1(BiTree T)
{
if (T)
{
InOrderTravel1(T->lchild);
cout << T->data;
InOrderTravel1(T->rchild);
}

}
//后序
void TailOrderTravel1(BiTree T)
{
if (T)
{
TailOrderTravel1(T->lchild);
TailOrderTravel1(T->rchild);
cout << T->data;
}
}



//栈
typedef struct
{
BiTNode* stack[1000];
int top;
}SqStack;
void InitStack(SqStack& S)
{
S.top = -1;
}
int StackEmpty(SqStack S)
{
if (S.top == -1)
return 1;
else
return 0;
}
void Push(SqStack& S, BiTNode* e)
{

S.top++;
S.stack[S.top] = e;

}
void Pop(SqStack& S, BiTNode* e)
{

e = S.stack[S.top];
S.top--;
}
//非递归
void InOrderTravel2(BiTree T)
{
SqStack S;
InitStack(S);
BiTree p = T;
BiTNode* q=new BiTNode;
while (p || !StackEmpty(S))
{
if (p)
{
Push(S, p);
p = p->lchild;
}
else
{
Pop(S, q);
cout << q->data;
p = q->rchild;
}
}
}

//复制
void Copy(BiTree T, BiTree& newT)
{
if (T == NULL)
{
newT = NULL;
return;
}
else
{
newT = new BiTNode;
newT->data = T->data;
Copy(T->lchild, newT->lchild);
Copy(T->rchild, newT->rchild);
}
}
//深度
int Depth(BiTree T)
{
int m, n;
if (T == NULL)
return 0;
else
{
m = Depth(T->lchild);
n = Depth(T->rchild);
if (m > n)
return (m + 1);
else
return (n + 1);
}
}

int main()
{
BiTree T;
cout << "请输入建立二叉链表的序列:\n";
InitBiTree(T);
cout << "先序遍历结果为:\n";
PreOrderTravel1(T);
cout << "\n";
cout << "中序遍历结果为:\n";
InOrderTravel1(T);
cout << "\n";
cout << "中序遍历结果为(非递归):\n";
InOrderTravel2(T);
cout << "\n";
cout << "后序遍历结果为:\n";
TailOrderTravel1(T);
cout << "\n";
BiTree newT;
Copy(T, newT);
cout << "复制得到的新树先序遍历结果为:\n";
PreOrderTravel1(newT);
cout << "\n";
cout << "制得到的新树中序遍历结果为:\n";
InOrderTravel1(newT);
cout << "\n";
cout << "制得到的新树后序遍历结果为:\n";
TailOrderTravel1(newT);
cout << "\n";
cout << "树的深度为:\n";
cout << Depth(T);

}
...全文
356 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qzjhjxj 2021-05-06
  • 打赏
  • 举报
回复
退栈函数 void Pop(SqStack& S, BiTNode* e) 写的不对,修改如下,供参考:
#include<iostream>
using namespace std;

typedef struct BiTNode
{
    char   data;
    struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;

void InitBiTree(BiTree& T)
{
    char c;
    cin >> c;
    if (c == '#')
       T = NULL;
    else{
       T = new BiTNode;
       T->data = c;
       InitBiTree(T->lchild);
       InitBiTree(T->rchild);
    }
}

void PreOrderTravel1(BiTree T)
{
    if (T){
        cout << T->data;
        PreOrderTravel1(T->lchild);
        PreOrderTravel1(T->rchild);
    }
}
//中序
void InOrderTravel1(BiTree T)
{
   if (T){
       InOrderTravel1(T->lchild);
       cout << T->data;
       InOrderTravel1(T->rchild);
   }
}
//后序
void TailOrderTravel1(BiTree T)
{
   if (T){
      TailOrderTravel1(T->lchild);
      TailOrderTravel1(T->rchild);
      cout << T->data;
   }
}
//栈 
typedef struct
{
    BiTNode* stack[1000];
    int top;
}SqStack;
void InitStack(SqStack& S)
{
    S.top = -1;
}
int StackEmpty(SqStack S)
{
   if (S.top == -1)
       return 1;
   else
       return 0;
}
void Push(SqStack& S, BiTNode* e)
{
   S.top++;
   S.stack[S.top] = e;

}
BiTree Pop(SqStack& S)//void Pop(SqStack& S, BiTNode* e)
{
   BiTree e = S.stack[S.top];
   S.top--;
   return e;
}
//非递归  中序遍历
void InOrderTravel2(BiTree T)
{
   SqStack S;
   InitStack(S);
   BiTree p = T;
   //BiTNode* q=new BiTNode;
   while (p || !StackEmpty(S)){
         if (p){
            Push(S, p);
            p = p->lchild;
         }else{
            p=Pop(S);
            cout << p->data;
            p = p->rchild;
         }
   }
}

//复制
void Copy(BiTree T, BiTree& newT)
{
    if (T == NULL){
        newT = NULL;
        return;
    }else{
        newT = new BiTNode;
        newT->data = T->data;
        Copy(T->lchild, newT->lchild);
        Copy(T->rchild, newT->rchild);
    }
}
//深度
int Depth(BiTree T)
{
    int m, n;
    if (T == NULL)
       return 0;
    else{
       m = Depth(T->lchild);
       n = Depth(T->rchild);
       if (m > n)
           return (m + 1);
       else
           return (n + 1);
    }
}

int main()
{
    BiTree T;
    cout << "请输入建立二叉链表的序列:\n";
    InitBiTree(T);

    cout << "先序遍历结果为:\n";
    PreOrderTravel1(T);
    cout << "\n";

    cout << "中序遍历结果为:\n";
    InOrderTravel1(T);
    cout << "\n";

    cout << "中序遍历结果为(非递归):\n";
    InOrderTravel2(T);
    cout << "\n";

    cout << "后序遍历结果为:\n";
    TailOrderTravel1(T);
    cout << "\n";

    BiTree newT;
    Copy(T, newT);
    cout << "复制得到的新树先序遍历结果为:\n";
    PreOrderTravel1(newT);
    cout << "\n";

    cout << "制得到的新树中序遍历结果为:\n";
    InOrderTravel1(newT);
    cout << "\n";

    cout << "制得到的新树后序遍历结果为:\n";
    TailOrderTravel1(newT);
    cout << "\n";

    cout << "树的深度为:\n";
    cout << Depth(T);
    
    return 0;
}


//请输入建立二叉链表的序列:
//abc##de#f##g###
//先序遍历结果为:
//abcdefg
//中序遍历结果为:
//cbefdga
//中序遍历结果为(非递归):
//cbefdga
//后序遍历结果为:
//cfegdba
//复制得到的新树先序遍历结果为:
//abcdefg
//制得到的新树中序遍历结果为:
//cbefdga
//制得到的新树后序遍历结果为:
//cfegdba
//树的深度为:
//5请按任意键继续. . .
m0_53664180 2021-05-04
  • 打赏
  • 举报
回复
引用 3 楼 NorZ 的回复:
[quote=引用 2 楼 m0_53664180 的回复:][quote=引用 1 楼 真相重于对错的回复:]没有对节点的左右子树初始化,因此地址是随机值
请问要怎么改呢[/quote] new 出来节点之后给 lchild rchild 赋值 NULL[/quote]
NorZ 2021-04-30
  • 打赏
  • 举报
回复
引用 2 楼 m0_53664180 的回复:
[quote=引用 1 楼 真相重于对错的回复:]没有对节点的左右子树初始化,因此地址是随机值
请问要怎么改呢[/quote] new 出来节点之后给 lchild rchild 赋值 NULL
赵4老师 2021-04-30
  • 打赏
  • 举报
回复
引用 4 楼 千梦一生 的回复:
P是0xCDCDCDCD...... 翻译成中文就是屯屯屯屯......
windows里常见的内存填充数据含义  * 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory 漱 * 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers 涵? * 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory 很? * 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger 撅饰 * 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files 烫烫 * 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory 屯屯 * 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory 葺葺 * 0xDDDDDDDD : Used by Microsoft's free() or delete to mark freed heap memory 蕲蕲 * 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash  * 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory  * 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory
千梦一生 2021-04-30
  • 打赏
  • 举报
回复
P是0xCDCDCDCD...... 翻译成中文就是屯屯屯屯......
m0_53664180 2021-04-29
  • 打赏
  • 举报
回复
引用 1 楼 真相重于对错的回复:
没有对节点的左右子树初始化,因此地址是随机值
请问要怎么改呢
真相重于对错 2021-04-29
  • 打赏
  • 举报
回复
没有对节点的左右子树初始化,因此地址是随机值

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧