#include<iostream>
using namespace std;
#define MAX 1500
//二叉树定义
typedef struct BiTreeNode{
char data;
BiTreeNode *lChild;
BiTreeNode *rChild;
int lTag,rTag;
}BiTreeNode;
//全局变量
BiTreeNode *pre =NULL;
BiTreeNode *point[MAX+1]; //构建二叉树时辅助,用于定位子节点
//构建二叉树
BiTreeNode *CreateBiTree()
{
BiTreeNode *root=(BiTreeNode *)malloc(sizeof(BiTreeNode));
int i,j;char data;
cout<<"输入结点索引值i,和结点值data,以0 #结束\n";
cin>>i>>data;
while(i!=0&&data!='#')
{
BiTreeNode *newNode=(BiTreeNode *)malloc(sizeof(BiTreeNode));
newNode->data=data;
newNode->lTag=0;newNode->rTag=0;
newNode->lChild=NULL;newNode->rChild=NULL;
point[i]=newNode;
if(i==1) //为二叉树根节点
{
root=point[1];
}
else
{
j=i/2;
if(i%2==0) //为左孩子结点
{
point[j]->lChild=newNode;
}
else
{
point[j]->rChild=newNode;
}
}
cin>>i>>data;
}
return root;
}
//中序线索化二叉树,pre初始化为NULL
void Inthread(BiTreeNode *root)
{
if(root!=NULL)
{
Inthread(root->lChild);
if(root->lChild==NULL)
{
root->lTag=1;root->lChild=pre;
}
if(pre!=NULL&&pre->rChild==NULL)
{
pre->rTag=1;pre->rChild=root;
}
pre=root;
Inthread(root->rChild);
}
}
//查找结点p的前驱结点
BiTreeNode *InPre(BiTreeNode *p)
{
if(p->lTag==1)return p->lChild;
BiTreeNode *q=p->lChild;
if(q==NULL){
cout<<"无前驱结点\n";
return NULL;
}
while(q->rTag!=1)
{
q=q->rChild;
}
return q;
}
//查找结点p的后继结点
BiTreeNode *InSub(BiTreeNode *p)
{
if(p->rTag==1)return p->rChild;
BiTreeNode *q=p->rChild;
if(q==NULL){
cout<<"无后继结点\n";
return NULL;
}
while(q->lTag==0)
{
q=q->lChild;
}
return q;
}
//插入结点到线索二叉树
bool InsertNode(BiTreeNode *p,int index,char method)
{
if(method!='l'&&method!='L'&&method!='r'&&method!='R')
{
cout<<"命令有误,插入方式为l,L,r,R.\n";
return false;
}
if(point[index]==NULL) //不存在该结点
{
cout<<"插入的位置无效\n";
return false;
}
if(method=='l'||method=='L') //插入为poinit[index]所指向结点的左孩子结点O(∩_∩)O~有点拗口
{
if(point[index]->lTag==1) //插入位置的结点无左孩子结点
{
p->lChild=point[index]->lChild;
point[index]->lChild=p;
p->lTag=1;p->rTag=1;
point[index]->lTag=0;
}
else //有左孩子结点,需找到point[index]左子树最右下角的结点
{
BiTreeNode *s=point[index]->lChild;
while(s->rTag==0)s=s->rChild;
p->lChild=point[index]->lChild;
point[index]->lChild=p;
s->rChild=p;
p->lTag=0;p->rTag=1;
}
point[index*2]=p;
}
if(method=='r'||method=='R')
{
if(point[index]->rTag==1) //无右孩子结点
{
p->rChild=point[index]->rChild;
point[index]->rChild=p;
p->lChild=point[index];
point[index]->rTag=0;
p->rTag=1;p->lTag=1;
}
else //存在有孩子结点,需找到右子树最左下角的结点
{
BiTreeNode *s=point[index]->rChild;
while(s->lChild==0)s=s->lChild;
p->rChild=point[index]->rChild;
point[index]->rChild=p;
p->lChild=point[index];
p->rTag=0;p->lTag=1;
s->lChild=p;
}
point[index*2+1]=p;
}
return true;
}
int main()
{
char cmd,data;int index;
do{
BiTreeNode *root=CreateBiTree();
Inthread(root);
cout<<"输入您要查找的结点,序号index\n";
cin>>index;
BiTreeNode *nodePre=InPre(point[index]);
BiTreeNode *nodeSub=InSub(point[index]);
if(nodePre!=NULL)
cout<<"结点"<<index<<"的前驱结点的值为"<<nodePre->data<<"\n";
if(nodeSub!=NULL)
cout<<"结点"<<index<<"的后继结点的值为"<<nodeSub->data<<"\n";
cout<<"\n"<<"输入插入结点的值,及插入的位置,插入的方式(l,r or L,R)\n";
cin>>data>>index>>cmd;
BiTreeNode *p=(BiTreeNode *)malloc(sizeof(BiTreeNode));
p->data=data;
InsertNode(p,index,cmd);
cout<<"继续吗Y/y?\n";
cin>>cmd;
}while(cmd=='Y'||cmd=='y');
return 0;
}
线索二叉树中插入结点
最新推荐文章于 2024-02-03 20:27:25 发布

620

被折叠的 条评论
为什么被折叠?



