C 线程二叉树的有序后继树
我正在编写一个c程序来创建线程二叉树,然后查找特定节点的后续节点。为此,我将显示TBT构造的顺序,然后要求用户输入要显示后续节点的节点。。我写了一个函数来做这个。但是我没有得到第一个节点的继任者。。最后一个节点的后继节点为0,无论以何种方式都可以正常工作。。有人能帮我修一下吗? 以下是整个计划:C 线程二叉树的有序后继树,c,data-structures,binary-search-tree,C,Data Structures,Binary Search Tree,我正在编写一个c程序来创建线程二叉树,然后查找特定节点的后续节点。为此,我将显示TBT构造的顺序,然后要求用户输入要显示后续节点的节点。。我写了一个函数来做这个。但是我没有得到第一个节点的继任者。。最后一个节点的后继节点为0,无论以何种方式都可以正常工作。。有人能帮我修一下吗? 以下是整个计划: #include<stdio.h> #include <stdlib.h> struct tbtnode { int data; struct t
#include<stdio.h>
#include <stdlib.h>
struct tbtnode {
int data;
struct tbtnode *left,*right;
int lbit,rbit,flag;
int child;
}*root=NULL;
typedef struct tbtnode TBT;
TBT *insuc(TBT *t);
void inorder(TBT *);
void create(TBT *);
void create(TBT *root)
{
int x,op,flag,y;
flag=0;
char ch;
TBT *curr=root;
TBT *q,*p;
do
{
printf("\nCurrent node %d \n\n 1.Left Direction.\n\n2.Right Direction",curr->data);
printf("\nEnter ur choice :");
scanf("%d",&op);
switch(op)
{
case 1: if(curr->lbit==1)
{
printf("Enter left child of %d : ",curr->data);
scanf("%d",&x);
q=(TBT *)malloc(sizeof(TBT));
q->data=x;
q->lbit=q->rbit=1;
q->left=curr->left;
q->right=curr;
curr->left=q;
curr->lbit=0;
q->child=0;
flag=1;
}
else
curr=curr->left;
break;
case 2: if(curr->rbit==1)
{
printf("Enter right child of %d :",curr->data);
scanf("%d",&x);
q=(TBT *)malloc(sizeof(TBT));
q->data=x;
q->lbit=q->rbit=1;
q->left=curr;
q->right=curr->right;
curr->right=q;
curr->rbit=0;
q->child=1;
flag=1;
}
else
curr=curr->right;
break;
}
}while(flag==0);
}
void inorder(TBT *head)
{
TBT *t;
t=head->left;
printf("\n");
while(t->lbit==0)
t=t->left;
while(t!=head)
{
printf(" %d",t->data);
t=insuc(t);
}
}
TBT *insuc(TBT *t)
{
if(t->rbit==0)
{
t=t->right;
while(t->lbit==0)
t=t->left;
return(t);
}
else
return(t->right);
}
void inorder_successor(TBT *head,int x)
{
TBT *t;
t=head->left;
printf("\n");
while(t->lbit==0)
t=t->left;
while(t!=head)
{
t=insuc(t);
if(t->data==x)
{
t=insuc(t);
printf(" %d",t->data);
}
}
}
int main()
{
int op,x,n,i=0,item;
char ch;
TBT *head,*root,*succ; //here head indicates dummy variable
head=(TBT *)malloc(sizeof(TBT));
head->left=head;
head->right=head;
head->lbit=1;
head->rbit=1;
do
{
printf("\n****Threaded binary tree operations****");
printf("\n1)create\n2)inorder\n3)Successor\n4)exit");
printf("\nEnter ur choice: ");
scanf("%d",&op);
switch(op)
{
case 1:
printf("\nEnter Number Of Nodes :");
scanf("%d",&n);
printf("\nEnter root data: ");
scanf("%d",&x);
root=(TBT *)malloc(sizeof(TBT));
root->data=x;
root->lbit=root->rbit=1;
root->child=0;
root->left=head->left;
head->left=root;
head->lbit=0;
root->right=head->right;
for(i=0;i<n-1;i++)
create(root);
break;
case 2:
printf("\nInorder Traversal Is:\n");
inorder(head);
break;
case 3: printf("Enter the node to which successor is to be found\n");
scanf("%d",&item);
inorder_successor(head,item);
break;
case 4:
return(0);
break;
}
}while(op<=4);
return 0;
}
#包括
#包括
结构tbtnode{
int数据;
结构tbtnode*左,*右;
国际lbit、rbit、flag;
智力儿童;
}*root=NULL;
类型定义结构TBT节点TBT;
技术性贸易壁垒*INSOC(技术性贸易壁垒*t);
订单无效(待定*);
无效创建(TBT*);
无效创建(待定*根)
{
int x,op,flag,y;
flag=0;
char ch;
TBT*电流=根;
技术性贸易壁垒*q,*p;
做
{
printf(“\n当前节点%d\n\n 1.左方向。\n\n2.右方向”,当前->数据);
printf(“\n输入您的选择:”);
scanf(“%d”和&op);
开关(op)
{
案例1:if(curr->lbit==1)
{
printf(“输入%d的左子项:”,当前->数据);
scanf(“%d”和&x);
q=(TBT*)马洛克(sizeof(TBT));
q->data=x;
q->lbit=q->rbit=1;
q->左=当前->左;
q->右=当前;
当前->左=q;
curr->lbit=0;
q->child=0;
flag=1;
}
其他的
当前=当前->左侧;
打破
案例2:如果(当前->rbit==1)
{
printf(“输入%d的右子项:”,当前->数据);
scanf(“%d”和&x);
q=(TBT*)马洛克(sizeof(TBT));
q->data=x;
q->lbit=q->rbit=1;
q->左=当前;
q->右=当前->右;
curr->right=q;
当前->rbit=0;
q->child=1;
flag=1;
}
其他的
当前=当前->右侧;
打破
}
}while(flag==0);
}
订单无效(待定*表头)
{
技术性贸易壁垒*t;
t=头部->左侧;
printf(“\n”);
而(t->lbit==0)
t=t->左;
while(t!=头)
{
printf(“%d”,t->data);
t=因苏克(t);
}
}
技术性贸易壁垒*INSOC(技术性贸易壁垒*t)
{
如果(t->rbit==0)
{
t=t->右;
而(t->lbit==0)
t=t->左;
返回(t);
}
其他的
返回(t->右);
}
订单后继者无效(TBT*head,int x)
{
技术性贸易壁垒*t;
t=头部->左侧;
printf(“\n”);
而(t->lbit==0)
t=t->左;
while(t!=头)
{
t=因苏克(t);
如果(t->data==x)
{
t=因苏克(t);
printf(“%d”,t->data);
}
}
}
int main()
{
int op,x,n,i=0,项;
char ch;
TBT*head,*root,*succ;//这里head表示伪变量
头=(TBT*)马洛克(尺寸(TBT));
头部->左侧=头部;
头部->右侧=头部;
头部->lbit=1;
头部->rbit=1;
做
{
printf(“\n****线程化二叉树操作****”);
printf(“\n1)创建\n2)顺序\n3)后续\n4)退出”);
printf(“\n输入您的选择:”);
scanf(“%d”和&op);
开关(op)
{
案例1:
printf(“\n输入节点数:”);
scanf(“%d”和“&n”);
printf(“\n输入根数据:”);
scanf(“%d”和&x);
根=(TBT*)malloc(sizeof(TBT));
根->数据=x;
root->lbit=root->rbit=1;
root->child=0;
根->左=头->左;
头部->左侧=根部;
头部->lbit=0;
根->右=头->右;
对于(i=0;i您的代码有很多问题。首先,您从不检查NULL
指针。要继续,您在main
中有一个名为root
的全局变量和局部变量
最后一件事是,当您在main
中为root
分配内存时,您为局部变量分配内存,而全局变量仍然是NULL
还有一些看起来很奇怪的事情,比如你把头的指针分配给它自己
我认为您需要首先在纸上列出所有内容,包括您现在拥有的内容和您想要的内容。这将帮助您更好地可视化树。在调试器中逐行查看代码。如果您没有发现问题,希望您可以缩小范围,只显示相关代码,而不是所有内容。不幸的是,我就是我们正在运行Mac,我不知道如何在gcc Mac中运行调试器:(gdb
不能像gcc
那样安装在Mac上?。@JoachimPileborg,inorder\u succession()中出错了……它没有为inorder序列的第一个节点提供后续。。