永发信息网

请帮我修改二叉树的建立和后续遍历的演示

答案:1  悬赏:10  手机版
解决时间 2021-07-21 17:25
  • 提问者网友:两耳就是菩提
  • 2021-07-20 20:41

#ifndef _STACK_H

#define _STACK_H

#define STACK_INIT_SIZE 100 //初始栈的最大长度

#define STACKINCREMENT 10 //每次新增的栈的长度

template <class DataType>

class Stack{

public:

Stack();

void Push(DataType e); //插入为e的新栈顶元素

int Pop(DataType &e); //删除栈顶元素

int GetTop(DataType &e); //取出栈顶元素

int StackEmpty(); //判断栈是否为空:空返回

void DestroyStack(); //栈被销毁

private:

DataType *base; //栈尾

DataType *top; //栈顶

int stacksize;

};

template <class DataType>

Stack<DataType>::Stack()

{

if(!(base=(DataType*)malloc(STACK_INIT_SIZE*sizeof(DataType)))) exit(1);

top=base;

stacksize=STACK_INIT_SIZE;

}

template <class DataType>

void Stack<DataType>::Push(DataType e)

{

if(top-base>=stacksize){

if(!(base=(DataType*)realloc(base,(stacksize+STACKINCREMENT)*sizeof(DataType)))) exit(1);

top=base+stacksize;

stacksize+=STACKINCREMENT;

}

*top++=e;

}

template <class DataType>

int Stack<DataType>::Pop(DataType &e)

{

if(top==base) return 0;

e=*--top;

return 1;

}

template <class DataType>

int Stack<DataType>::GetTop(DataType &e)

{

if(top==base) return 0;

e=*(top-1);

return 1;

}

template <class DataType>

int Stack<DataType>::StackEmpty()

{

return top==base? 1:0;

}

template <class DataType>

void Stack<DataType>::DestroyStack()

{

free(base);

}

#endif

#ifndef _BITREE_H

#define _BITREE_H

#include "Stack.h"

template <class DataType>

class BiTree; //友元类引用申明

template <class DataType>

class TreeNode

{

TreeNode():lchild(NULL),rchild(NULL){}

friend class BiTree<DataType>;

private:

DataType data;

TreeNode *lchild,*rchild;

};

template <class DataType>

class BiTree{

public:

void CreateBiTree(); //创建根节点------主过程

void CreateBiTree(TreeNode<DataType>* &p); //创建节点函数----子过程

void PosROrderTraverse(); //递归------后序遍历二叉树---主过程

void PosROrderTraverse(TreeNode<DataType>* p); //递归------后序遍历二叉树---子过程

void PosOrderTraverse(); //非递归------后序遍历二叉树

private:

TreeNode<DataType>* root; //树根

DataType temp; //代表元素为空的符号

};

template <class DataType>

void BiTree<DataType>::CreateBiTree()

{

cout<<"请输入代表元素为空的符号:";

cin>>temp; if(!(root=(TreeNode<DataType>*)malloc(sizeof(TreeNode<DataType>)))) exit(1);

cout<<"请输入数据:"<<endl;

CreateBiTree(root);

}

template <class DataType>

void BiTree<DataType>::CreateBiTree(TreeNode<DataType>* &p)

{

TreeNode<DataType>* px;

if(!(px=(TreeNode<DataType>*)malloc(sizeof(TreeNode<DataType>)))) exit(1);

cin>>px->data;

if(px->data==temp) {p=NULL;free(px);}

else{

p=px;

CreateBiTree(px->lchild);

CreateBiTree(px->rchild);

}

}

template <class DataType>

void BiTree<DataType>::PosROrderTraverse()

{

PosROrderTraverse(root);

}

template <class DataType>

void BiTree<DataType>::PosROrderTraverse(TreeNode<DataType>* p)

{

if(p){

PosROrderTraverse(p->lchild);

PosROrderTraverse(p->rchild);

cout<<p->data<<" ";

}

}

template <class DataType>

void BiTree<DataType>::PosOrderTraverse()

{

Stack<TreeNode<DataType>*> S;

TreeNode<DataType>* p;

TreeNode<DataType>* r; //使用r节点表示访问了右子树替代标志域

p=root;

while(p||!S.StackEmpty())

{

if(p){S.Push(p);p=p->lchild;}

else{

S.GetTop(p);

if(p->rchild&&p->rchild!=r){p=p->rchild;S.Push(p);p=p->lchild;}

else{S.Pop(p);cout<<p->data<<" ";r=p;p=NULL;}

}

}

S.DestroyStack();

}

#endif

#include<iostream>

#include "BiTree.h"

using namespace std;

int main()

{

BiTree<char> my;

my.CreateBiTree();

my.PosROrderTraverse();

cout<<endl;

my.PosOrderTraverse();

return 0;

}
最佳答案
  • 五星知识达人网友:梦中风几里
  • 2021-07-20 21:12
你好。
很幸运看到你的问题。
但是又很遗憾到现在还没有人回答你的问题。也可能你现在已经在别的地方找到了答案,那就得恭喜你啦。
对于你的问题我爱莫能助!
可能是你问的问题有些专业了。或者别人没有遇到或者接触过你的问题,所以帮不了你。建议你去问题的相关论坛去求助,那里的人通常比较多,也比较热心,可能能快点帮你解决问题。
希望我的回答也能够帮到你!
快过年了,
最后祝您全家幸福健康快乐每一天!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯