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

2024-04-20

所以,在这里我想出了二叉搜索树程序,其中我创建了 2 个二叉树 tmp 和 tmp2,我试图将整个 tmp2 复制到 tmp,该节点作为用户的输入。但我遇到了一些分段错误,而且我也不太确定逻辑是否正确。 这是整个程序,请让我知道 t_cpy() 哪里出了问题,或者请帮我修复它。

#include<stdio.h>
#include<stdlib.h>

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->data<root->data)
            {
                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(val<temp->data)
            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(val<temp->data)
        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 直到它为空,并在下一行取消引用它。

while(temp!=NULL)
    {
        if(val<temp->data)
            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,您很可能想跳出此循环,但您没有。另外,您仍然需要检查循环后 temp 是否为 null,以防您在树中找不到 val。很可能你只是想说:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 程序将一棵二叉搜索树复制到另一棵 的相关文章

随机推荐

  • VIM:在窗口左侧显示 3 个字符边框

    Context 我正在使用 NERDTree 插件 让我烦恼的一件事是 NERDTree 本身和我的代码之间的视觉垂直边界 我发现阅读我的代码有点烦人 我当前的设置如下所示
  • Minix 与 Linux 相比如何学习操作系统设计?

    我想学习操作系统设计 我想知道在此过程中我是否应该解决 Minix 或 GNU Linux 问题 我喜欢书籍 所以我主要关注一本书 尽管视频资源 大概是录像讲座 也很受欢迎 我已经正式学习了 C 和 C 可以用它们编写中小型程序 我对数据结
  • Java 泛型和设计模式:不参数化对泛型类型的引用总是一件坏事?

    这个问题与我的上一个问题部分相关question https stackoverflow com questions 7300163 java generic programming with unknown generic type of
  • 将 IntelliJ IDEA 缓存/索引目录移动到 RAM

    我正在尝试移动caches and index从 IntelliJ IDEA 配置目录到 RAM 挂载点的目录 tmp使用符号链接 我已经添加 tmpfs tmp ramdisk tmpfs defaults size 1024M x gv
  • React 路由器将查询附加到 URL

    React 路由器似乎在我的路由末尾附加了一个查询 该应用程序由运行 Express 的节点服务器提供服务 我正在使用最新版本的反应路由器 1 0 0 rc1 例子 http localhost 8080 users k 8wsy62 两个
  • Mercurial:虚拟合并后分支特定的更改不断返回

    我有一个 Mercurial 存储库 有两个永久分支 默认分支和 UAT 每隔一段时间 我们就会将应用程序的新版本部署 升级 到 UAT 环境 并通过将稳定的默认提交合并到 UAT 分支来实现这一点 有时 UAT 分支中的错误会得到修复 并
  • 对于有多个孩子的单亲,正确使用 fork() 和 pipeline() 。我该如何正确地做到这一点?

    So my 上一篇文章 https stackoverflow com questions 26321100 concept any good c example of fork pipe where one parent creates
  • KVO vs NSNotification vs 协议/委托?

    我知道何时使用哪个 但确切的用法我仍然不清楚 有人可以举例解释吗 如果您只想与一个对象对话 请使用委托 例如 tableView 有一个委托 只有一个对象应该负责处理它 如果您想告诉每个人发生了什么事 请使用通知 例如 在内存不足的情况下
  • 如何在 C++ 中打印带前缀 + 的正数

    有没有办法在 C 中打印整数及其符号 即默认情况下 如果数字为负数 我们会得到一个 印有标志 同理我们可以得到 在正数之前 int x 1 cout lt lt x lt
  • 使用 workbox-webpack-plugin 时,预缓存资源使用什么工作箱策略?

    我正在尝试了解工作箱和服务人员 使用workbox webpack plugin和GenerateSW模式时 用于预缓存资源的workbox策略是什么 IE 因为我似乎没有为预缓存资产设置路由 策略 以便服务工作线程更新这些资产的缓存 那么
  • PHP 本地化 - gettext 还是数组?

    设置多语言网站现在我需要决定为网站上的静态文本使用哪个选项 让我解释一下我的网站设置 然后您是否可以帮助我决定使用哪种解决方案 该站点是一个CMS系统 允许多个域指向同一目录并根据域名提供内容 因此所有域共享相同的代码 在网站上 我创建了称
  • iOS Safari:清除输入类型日期

    我制作了一个 NET mvc 应用程序 其中有一个字段 在 iPhone 在 Safari 中 上 一旦我单击此字段 就会出现一个本机 iOs 日期选择器 它有效 我可以选择一个日期 确认它 使用 完成 按钮 并提交表格 然后我再次访问此页
  • 克隆任意对象的函数

    我正在寻找一种方法来克隆在编译时 或运行时 我认为 未知的对象 问题的确切措辞是 编写一个可以克隆任意对象的函数 例如 将未知对象传递给函数 返回对象的深层副本 我猜我需要使用反射来读取函数和变量 然后了解如何创建一个新对象并将这些值分配给
  • 如何将三级词典转换为所需的格式?

    我有一个像这样的三级字典 data 2016 11 28 area1 am 0 007 pm 0 008 area2 am 0 0 pm 0 0 area3 am 0 01 pm 0 001 2016 11 29 area1 am 0 00
  • 以数据为中心的应用程序模型和面向对象的应用程序模型有什么区别?

    什么是以数据为中心的应用程序 与面向对象的应用程序模型有什么区别 这两个概念有些正交 以数据为中心的应用程序 http en wikipedia org wiki Database centric architecture数据库起着关键作用
  • docker-compose 无法启动

    我之前按照本演练成功创建了一系列 docker 容器 这些容器允许我使用 MySQLI PHP 和 phpmyadmin https gist github com jcavat 2ed51c6371b9b488d6a940ba104918
  • 使用指针作为函数参数时的段前缀

    我有一个汇编 c 问题 我刚刚读到了有关段前缀的内容 例如 ds varX 等 前缀对于逻辑地址的计算很重要 我也读到 默认值是 ds 一旦您使用 ebp 寄存器来计算地址 就会使用 ss 对于代码 cs 是默认值 这一切都是有道理的 现在
  • 如何将字符串中的表达式传递给 dplyr 0.7.2 中的动词

    我正在尝试实施我在网上找到的建议 但我的目标还差一半 这是一个可重现的示例 library tidyverse library dplyr library rlang data mtcars filter expr am 1 mutate
  • 有没有办法在 Google Directory API users.list 查询中使用“或”运算符?

    我想使用以下命令为 Google 域用户构建搜索查询用户列表 谷歌目录API 我尝试根据docs https developers google com admin sdk directory v1 guides search users
  • C 程序将一棵二叉搜索树复制到另一棵

    所以 在这里我想出了二叉搜索树程序 其中我创建了 2 个二叉树 tmp 和 tmp2 我试图将整个 tmp2 复制到 tmp 该节点作为用户的输入 但我遇到了一些分段错误 而且我也不太确定逻辑是否正确 这是整个程序 请让我知道 t cpy