C程序将一个二叉搜索树复制到另一个

所以,在这里我提出了二进制搜索树prgram,我在其中创建了2个二进制树tmp和tmp2,其中我试图将整个tmp2复制到tmp,该节点被用作用户的输入。 但我得到一些分段错误,我也不确定逻辑是否正确。 这是整个程序,请知道在t_cpy()中哪里出错了或者请为我修好..

#include #include struct node { int data; struct node *rlink; struct node *llink; }*tmp=NULL,*tmp2=NULL,*tmp3=NULL; typedef struct node NODE; NODE *create(); void inorder(NODE *); void insert(NODE *); void t_cpy(NODE *,NODE *); int main() { int n,m; do { printf("\n1.create tree 1\n2.Insert element to tree1\n3.create tree 2\n4.Insert element to tree2\n5.Inorder tree1\n6.Inorder tree2\n7.Copy tree2 to tree1\n8.exit\n\n"); printf("\nEnter ur choice: "); scanf("%d",&m); switch(m) { case 1: tmp=create(); break; case 2: insert(tmp); break; case 3: tmp2=create(); break; case 4: insert(tmp2); break; case 5: printf("\n\nInorder Tree1: "); inorder(tmp); break; case 6: printf("\n\nInorder Tree 2: "); inorder(tmp2); break; case 7: t_cpy(tmp,tmp2); break; case 8: return(0); } }while(n!=8); return(0); } void insert(NODE *root) { NODE *newnode; if(root==NULL) { newnode=create(); root=newnode; } else { newnode=create(); while(1) { if(newnode->datadata) { if(root->llink==NULL) { root->llink=newnode; break; } root=root->llink; } if(newnode->data>root->data) { if(root->rlink==NULL) { root->rlink=newnode; break; } root=root->rlink; } } } } NODE *create() { NODE *newnode; int n; newnode=(NODE *)malloc(sizeof(NODE)); printf("\n\nEnter the Data "); scanf("%d",&n); newnode->data=n; newnode->llink=NULL; newnode->rlink=NULL; return(newnode); } void t_cpy(NODE *t1,NODE *t2) { int val,opt=0; NODE *temp; if(t1==NULL || t2==NULL) { printf("Can not copy !\n"); } inorder(t1); printf("\nEnter the node value where tree 2 should be copied\n"); scanf("%d",&val); temp=t1; while(temp!=NULL) { if(valdata) temp=temp->llink; else temp=temp->rlink; } if(temp->llink!=NULL || temp->rlink!=NULL) printf("Not possible to copy tree to this node\n"); else { printf("Copy tree to \n 1.Left Node \n 2.Right Node\n Enter your choice : "); scanf("%d",&opt); if(opt==1) { temp->llink=t2; } else if(opt==2) { temp->rlink=t2; } else printf("Invalid choice\n"); } printf("Tree1 after copying is\n"); inorder(temp); } void inorder(NODE *tmp) { if(tmp!=NULL) { inorder(tmp->llink); printf("%d",tmp->data); inorder(tmp->rlink); } } 

编辑:感谢@xaxxon,他帮我解决了这个问题。 只需更新while即可使其正常工作:

 while(temp!=NULL&&temp->data!=val) { if(valdata) temp=temp->llink; else temp=temp->rlink; if(temp->llink==NULL && temp->rlink==NULL && temp->data!=val) { printf("Invalid Node value entered !\n"); //break; return 0; } 

如果输入的值存在于树中,它现在可以正常工作。

谢谢 :)

在其他可能的问题中,您遍历temp直到它为null,并在下一行中取消引用它。

 while(temp!=NULL) { if(valdata) temp=temp->llink; else temp=temp->rlink; } if(temp->llink!=NULL || temp->rlink!=NULL) printf("Not possible to copy tree to this node\n"); 

如果val == temp-> data,你很可能意味着要摆脱这个循环,但你没有。 此外,如果在树中找不到val,则仍需要检查循环后temp是否为null。 你很可能只是想说:

  if(temp==NULL) printf("Not possible to copy tree to this node\n"); 

此外,您无法询问用户想要将树复制到的找到节点的哪一侧。 如果你有一个二叉搜索树,它必须是值应该去的那一面。 如果您说将其复制到右侧,但所有值都小于节点,则它不再是BST。 事实上,你甚至不能问价值应该去哪里,仍然有一个二叉搜索树。 每个节点都必须从要放入另一棵树的树的根遍历,以维护BST机制。

当您第一次使用insert(tmp) ,调用insert()insert(tmp)的值不会改变。 将tmp的地址传递给insert() ,在其中使用* root而不是root。