中序线索化二叉树的问题

APIandMFC 2009-02-14 03:18:54
#include<iostream>
#include<cstdlib>
using namespace std;
enum PointerTag{Link,Thread};
template<class T>
class TreeNode
{
private:
TreeNode<T>* left;
TreeNode<T>* right;
public:
T data;
PointerTag LTag,RTag;
TreeNode(const T& item,TreeNode<T>* lptr,TreeNode<T>* rptr,PointerTag LT,PointerTag RT);
TreeNode<T>*& Left();
TreeNode<T>*& Right();

};

TreeNode<char>* pre;
template<class T>
TreeNode<T>::TreeNode(const T& item,TreeNode<T>* lptr,TreeNode<T>* rptr,PointerTag LT,PointerTag RT)
{
data=item;
left=lptr;
right=rptr;
LTag=LT;
RTag=RT;
}
template<class T>
TreeNode<T>*& TreeNode<T>::Left()
{
return left;
}
template<class T>
TreeNode<T>*& TreeNode<T>::Right()
{
return right;
}
template<class T>
TreeNode<T>* GetTreeNode(T item,TreeNode<T>* lptr,TreeNode<T>* rptr,PointerTag LT,PointerTag RT)
{
TreeNode<T>* p=new TreeNode<T>(item,lptr,rptr,LT,RT);
if(p==NULL)
{
cout<<"memory location failure"<<endl;
exit(1);
}
return p;
}
template<class T>
void FreeNode(TreeNode<T>* ptr)
{
delete ptr;
}
template<class T>
void InorderTree(TreeNode<T>* t)
{
if(t!=NULL)
{
InorderTree(t->Left());
cout<<t->data;
InorderTree(t->Right());
}
}
template<class T>
void CountLeaf(TreeNode<T>* t,int& count)
{
if(t!=NULL)
{
CountLeaf(t->Left(),count);
CountLeaf(t->Right(),count);
if(t->Left()==NULL && t->Right()==NULL)
count++;
}
}
template<class T>
int Depth(TreeNode<T>* t)
{
int left_depth=0,right_depth=0,tree_depth=0;
if(t==NULL)
{
return 0;
}
else
{
left_depth=Depth(t->Left());
right_depth=Depth(t->Right());
tree_depth=1+((left_depth>=right_depth)?left_depth:right_depth);
}
return tree_depth;
}
template<class T>
void DeleteTree(TreeNode<T>* t)
{
if(t!=NULL)
{
DeleteTree(t->Left());
DeleteTree(t->Right());
FreeNode(t);
}
}
template<class T>
void InThreading(TreeNode<T>* p)
{
if(p)
{
InThreading(p->Left());
if(!p->Left())
{
p->LTag=Thread;
p->Left()=pre;
}
if(!pre->Right())
{
pre->RTag=Thread;
pre->Right()=p;
}
pre=p;
InThreading(p->Right());
}
if(p==NULL)
{
cout<<"程序内部错误"<<endl;
exit(1);
}
}
template<class T>
void InOrderThreading(TreeNode<T>* Thrt,TreeNode<T>* t)
{
Thrt=(TreeNode<T>*)malloc(sizeof(TreeNode<T>));
if(!Thrt)
{
cout<<"内存不足,程序关闭"<<endl;
exit(1);
}
Thrt->LTag=Link;
Thrt->RTag=Thread;
Thrt->Right()=Thrt;
TreeNode<T>* pre;
if(!t)
{
Thrt->Left()=Thrt;
}
else
{
Thrt->Left()=t;
pre=Thrt;
InThreading(t);
pre->Right()=Thrt;
pre->RTag=Thread;
Thrt->Right()=pre;
}
}
template<class T>
void InOrderTraverse_Thr(TreeNode<T>* t)
{
TreeNode<T>*p=t->Left();
while(p!=t)
{
while(p->LTag==Link) p=p->Left();
if(p) cout<<p->data;
while(p->RTag==Thread && p->Right()!=t)
{
p=p->Right();
cout<<p->data;
}
p=p->Right();
}
}
void main()
{
TreeNode<char>* root;
TreeNode<char>* a_lptr=NULL,*a_rptr=NULL;
TreeNode<char>* b_lptr=NULL,*b_rptr=NULL;
TreeNode<char>* c_lptr=NULL,*c_rptr=NULL;
TreeNode<char>* d_lptr=NULL,*d_rptr=NULL;
TreeNode<char>* e_lptr=NULL,*e_rptr=NULL;
TreeNode<char>* p=GetTreeNode('E',e_lptr,e_rptr,Link,Link);
TreeNode<char>* q=GetTreeNode('D',d_lptr,d_rptr,Link,Link);
TreeNode<char>* r=GetTreeNode('B',b_lptr,q,Link,Link);
TreeNode<char>* s=GetTreeNode('C',p,c_rptr,Link,Link);
TreeNode<char>* t=GetTreeNode('A',r,s,Link,Link);
root=t;
int depth=0;
depth=Depth(root);
cout<<depth<<endl;
InorderTree(root);
cout<<endl;
int count=0;
CountLeaf(root,count);
cout<<count<<endl;
cout<<"线索二叉树:"<<endl;
TreeNode<char>* Thrt=NULL;
InOrderThreading(Thrt,root);
//InOrderTraverse_Thr(root);
DeleteTree(root);
}



我的目的是中序线索化一棵二叉树,但是有点错误,请大家帮我看看

涉及函数如下:
void InOrderThreading(TreeNode<T>* Thrt,TreeNode<T>* t)
void InThreading(TreeNode<T>* p)
...全文
297 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghao111 2009-02-14
  • 打赏
  • 举报
回复
希望对你有帮助
//二叉树的二叉线索链表表示
typedef struct BiThrNode
{
ElemType data;
struct BiThrNode *lchild,*rchild;//左、右孩子指针
int ltag,rtag;//左、右线索标志,为0时,表示lchild(rchild)指向结点的左(右)孩子;为1时,表示lchild(rchild)指向结点前驱(后继)
}BiThrNode,*BiThrNode;
//中序遍历二叉树T,并将其中序线索化
void InorderThread(BiThrTree p)
{
if(p)
{//初始化时,p指向根结点T,pre的初值为NULL
InorderThread(p->lchild);//左子树线索化
if(!p->lchild)p->ltag=1;//建立左线索标志
if(!p->rchild)p->rtag=1;//建立右线索标志
if(pre)
{
if(pre->rtag==1)pre->rchild=p;//pre的右线索指向*p
if(p->ltag==1)p->lchild=pre;//p的左线索指向*pre
}
pre=p;
InorderThread(p->rchild);//右子树线索化
}
}
waizqfor 2009-02-14
  • 打赏
  • 举报
回复
baihacker 2009-02-14
  • 打赏
  • 举报
回复
reference to:
http://topic.csdn.net/u/20080512/08/65ae67d7-aadb-4813-b774-662e338a37bb.html?seed=28610681
代码转载自:https://pan.quark.cn/s/a4b39357ea24 基于VHDL语言的24进制多功能数字钟 FPGA多功能数字钟设计 安装要求 本项目采用QuartusII9.0版本设计,非9.0版本打开可能会存在兼容性问题。 本项目选用FPGA器件为CycloneIII_EP3C40Q240C8 设计任务 设计一个24进制多功能数字电子钟,要求具备以下功能: (1)时钟显示:能够以十进制在7段数码管上显示“时”、“分”、“秒”、“十分之一秒”。 (2)校表功能:能够对时钟进行校正。 (3)启动/暂停功能:能够控制时钟的启动和暂停。 (4)一键清零功能:能够将时钟清零。 (5)整点报时功能:能够在整点时发出报时信号。 (6)闹钟功能:能够在设置的时间到达时发出闹钟信号。 顶层设计原理图如下: image 设计方案/设计原理及总体框图 设计实现思路: (1)计时功能。 计时功能主要由四个计数器模块共同构成,其中十分之一秒计时器为十进制计数、分,秒计时器为六十进制计数、小时计时器为二十四进制计数。 计时器之间采用进位信号进行串联。 (2)十进制7端数码管显示功能。 显示功能由译码器模块实现。 译码器模块的两个输入端分别为刷新端和数据端。 七个译码器的刷新端连接十分之一秒的周期脉冲信号。 而数据端连接计数器的输出端,用以将4位输出BCD码译码为7端数码管的七位显示信号。 (3)校表功能。 校表功能由二选一模块和校时模式选择器模块构成。 其中二选一模块用于连接下一级计时器模块的进位信号和手动按钮脉冲信号。 当控制信号为“0”时,二选一模块输出计时器模块的进位信号。 而当控制信号为“1”时,二选一模块输出手动按钮信号。 控制信号由校时模式选择器模块输出,校时模式选择器输出端连...

65,210

社区成员

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

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