Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为了遍历二进制搜索树,显示了一些错误_C_Binary Search Tree - Fatal编程技术网

C 为了遍历二进制搜索树,显示了一些错误

C 为了遍历二进制搜索树,显示了一些错误,c,binary-search-tree,C,Binary Search Tree,这是我用于BST顺序遍历的函数 void inOrder(struct node* root) { if(root==NULL) { return; } inOrder(root->left); printf("Key:%d,Pointer:%p\n",root->key,root); inOrder(root->right); } 同样的结构是 struct node{ int key; struc

这是我用于BST顺序遍历的函数

void inOrder(struct node* root)
{
    if(root==NULL)
    {
      return;
    }
    inOrder(root->left);
    printf("Key:%d,Pointer:%p\n",root->key,root);
    inOrder(root->right);
}
同样的结构是

struct node{
    int key;
    struct node *left,*right;
};
当我运行该函数时,我会为以下插入获得两个额外的0元素:

root=insert(root,7);
insert(root,4);
insert(root,10);
insert(root,3);
insert(root,5);
insert(root,1);
insert(root,2);
insert(root,0);
insert(root,8);
insert(root,14);
insert(root,6);
insert(root,9);
insert(root,16);
insert(root,12);
insert(root,15);
insert(root,17);
inOrder(root);printf("\n");
插入函数如下所示:

struct node *insert(struct node * root,int ele)
{
  struct node *temp=newNode(ele);
  struct node *tree=root;
  struct node *saver;

  if(root==NULL)
  {
    root=temp;
  }
  else
  {
    while(tree!=NULL)
    {
       saver=tree;      
        if(ele<tree->key)
          tree=tree->left;
        else
          tree=tree->right;
    }
    if(ele<saver->key)
    {
      saver->left=temp;
    }
    else
    {
      saver->right=temp;
    }
  }
  return saver;
}
struct node*insert(struct node*root,int ele)
{
结构节点*temp=newNode(ele);
结构节点*树=根;
结构节点*saver;
if(root==NULL)
{
根=温度;
}
其他的
{
while(树!=NULL)
{
储蓄者=树;
如果(电子钥匙)
树=树->左;
其他的
树=树->右;
}
如果(电子钥匙)
{
保存程序->左=温度;
}
其他的
{
保存程序->右侧=温度;
}
}
回流节电器;
}
输出显示两个0,与我添加的主要元素不同。我最近学习了二进制搜索树,并尝试实现它,有人能帮我纠正这个错误吗。提前感谢您插入

一定是

if(root==NULL)
{
  saver=temp;
}
因为您返回了saver(在您的版本中未初始化)

我想在你的主体中,代码不是你给出的,而是类似的东西

struct node * root = NULL;

root=insert(root,7);
insert(root,4);
...
如果我这样定义newNode:

struct node * newNode(int ele)
{
  struct node * r = malloc(sizeof(struct node));

  r->key = ele;
  r->left = r->right = NULL;
  return r;
}
我做了其他的改变:

pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra n.c
pi@raspberrypi:/tmp $ ./a.out
Key:0,Pointer:0xf04078
Key:1,Pointer:0xf04058
Key:2,Pointer:0xf04068
Key:3,Pointer:0xf04038
Key:4,Pointer:0xf04018
Key:5,Pointer:0xf04048
Key:6,Pointer:0xf040a8
Key:7,Pointer:0xf04008
Key:8,Pointer:0xf04088
Key:9,Pointer:0xf040b8
Key:10,Pointer:0xf04028
Key:12,Pointer:0xf040d8
Key:14,Pointer:0xf04098
Key:15,Pointer:0xf040e8
Key:16,Pointer:0xf040c8
Key:17,Pointer:0xf040f8

完整代码为:

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

struct node{
    int key;
    struct node *left,*right;
};

void inOrder(struct node* root)
    {
    if(root==NULL)
        {return;}
    inOrder(root->left);
    printf("Key:%d,Pointer:%p\n",root->key,root);
    inOrder(root->right);
    }

struct node * newNode(int ele)
{
  struct node * r = malloc(sizeof(struct node));

  r->key = ele;
  r->left = r->right = NULL;
  return r;
}

struct node *insert(struct node * root,int ele)
{
  struct node *temp=newNode(ele);
  struct node *tree=root;
  struct node *saver;

  if(root==NULL)
  {
    saver=temp;
  }
  else
  {
    while(tree!=NULL)
    {
      saver=tree;        
      if(ele<tree->key)
        tree=tree->left;
      else
        tree=tree->right;
    }
    if(ele<saver->key)
    {
      saver->left=temp;
    }
    else
    {
      saver->right=temp;
    }
  }
  return saver;
}

int main()
{
  struct node * root = NULL;

  root=insert(root,7);
  insert(root,4);
  insert(root,10);
  insert(root,3);
  insert(root,5);
  insert(root,1);
  insert(root,2);
  insert(root,0);
  insert(root,8);
  insert(root,14);
  insert(root,6);
  insert(root,9);
  insert(root,16);
  insert(root,12);
  insert(root,15);
  insert(root,17);
  inOrder(root);printf("\n");
}
#包括
#包括
结构节点{
int键;
结构节点*左、*右;
};
无效索引顺序(结构节点*根)
{
if(root==NULL)
{return;}
顺序(根->左);
printf(“键:%d,指针:%p\n”,根->键,根);
顺序(根->右);
}
结构节点*新节点(int ele)
{
结构节点*r=malloc(sizeof(结构节点));
r->key=ele;
r->left=r->right=NULL;
返回r;
}
结构节点*插入(结构节点*根,int元素)
{
结构节点*temp=newNode(ele);
结构节点*树=根;
结构节点*saver;
if(root==NULL)
{
节约=温度;
}
其他的
{
while(树!=NULL)
{
储蓄者=树;
如果(电子钥匙)
树=树->左;
其他的
树=树->右;
}
如果(电子钥匙)
{
保存程序->左=温度;
}
其他的
{
保存程序->右侧=温度;
}
}
回流节电器;
}
int main()
{
结构节点*root=NULL;
根=插入(根,7);
插入(根,4);
插入(根,10);
插入(根,3);
插入(根,5);
插入(根,1);
插入(根,2);
插入(根,0);
插入(根,8);
插入(根,14);
插入(根,6);
插入(根,9);
插入(根,16);
插入(根,12);
插入(根,15);
插入(根,17);
顺序(根);printf(“\n”);
}
插入

一定是

if(root==NULL)
{
  saver=temp;
}
因为您返回了saver(在您的版本中未初始化)

我想在你的主体中,代码不是你给出的,而是类似的东西

struct node * root = NULL;

root=insert(root,7);
insert(root,4);
...
如果我这样定义newNode:

struct node * newNode(int ele)
{
  struct node * r = malloc(sizeof(struct node));

  r->key = ele;
  r->left = r->right = NULL;
  return r;
}
我做了其他的改变:

pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra n.c
pi@raspberrypi:/tmp $ ./a.out
Key:0,Pointer:0xf04078
Key:1,Pointer:0xf04058
Key:2,Pointer:0xf04068
Key:3,Pointer:0xf04038
Key:4,Pointer:0xf04018
Key:5,Pointer:0xf04048
Key:6,Pointer:0xf040a8
Key:7,Pointer:0xf04008
Key:8,Pointer:0xf04088
Key:9,Pointer:0xf040b8
Key:10,Pointer:0xf04028
Key:12,Pointer:0xf040d8
Key:14,Pointer:0xf04098
Key:15,Pointer:0xf040e8
Key:16,Pointer:0xf040c8
Key:17,Pointer:0xf040f8

完整代码为:

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

struct node{
    int key;
    struct node *left,*right;
};

void inOrder(struct node* root)
    {
    if(root==NULL)
        {return;}
    inOrder(root->left);
    printf("Key:%d,Pointer:%p\n",root->key,root);
    inOrder(root->right);
    }

struct node * newNode(int ele)
{
  struct node * r = malloc(sizeof(struct node));

  r->key = ele;
  r->left = r->right = NULL;
  return r;
}

struct node *insert(struct node * root,int ele)
{
  struct node *temp=newNode(ele);
  struct node *tree=root;
  struct node *saver;

  if(root==NULL)
  {
    saver=temp;
  }
  else
  {
    while(tree!=NULL)
    {
      saver=tree;        
      if(ele<tree->key)
        tree=tree->left;
      else
        tree=tree->right;
    }
    if(ele<saver->key)
    {
      saver->left=temp;
    }
    else
    {
      saver->right=temp;
    }
  }
  return saver;
}

int main()
{
  struct node * root = NULL;

  root=insert(root,7);
  insert(root,4);
  insert(root,10);
  insert(root,3);
  insert(root,5);
  insert(root,1);
  insert(root,2);
  insert(root,0);
  insert(root,8);
  insert(root,14);
  insert(root,6);
  insert(root,9);
  insert(root,16);
  insert(root,12);
  insert(root,15);
  insert(root,17);
  inOrder(root);printf("\n");
}
#包括
#包括
结构节点{
int键;
结构节点*左、*右;
};
无效索引顺序(结构节点*根)
{
if(root==NULL)
{return;}
顺序(根->左);
printf(“键:%d,指针:%p\n”,根->键,根);
顺序(根->右);
}
结构节点*新节点(int ele)
{
结构节点*r=malloc(sizeof(结构节点));
r->key=ele;
r->left=r->right=NULL;
返回r;
}
结构节点*插入(结构节点*根,int元素)
{
结构节点*temp=newNode(ele);
结构节点*树=根;
结构节点*saver;
if(root==NULL)
{
节约=温度;
}
其他的
{
while(树!=NULL)
{
储蓄者=树;
如果(电子钥匙)
树=树->左;
其他的
树=树->右;
}
如果(电子钥匙)
{
保存程序->左=温度;
}
其他的
{
保存程序->右侧=温度;
}
}
回流节电器;
}
int main()
{
结构节点*root=NULL;
根=插入(根,7);
插入(根,4);
插入(根,10);
插入(根,3);
插入(根,5);
插入(根,1);
插入(根,2);
插入(根,0);
插入(根,8);
插入(根,14);
插入(根,6);
插入(根,9);
插入(根,16);
插入(根,12);
插入(根,15);
插入(根,17);
顺序(根);printf(“\n”);
}

在Ubuntu中返回
saver
键:0,指针:0x5605809da260键:0,指针:0x5605809da360键:1,指针:0x5605809da320键:2,指针:0x5605809da340键:3,指针:0x5605809da2e0键:4,指针:0x5605809da2a0键:5,指针:0x5605809da300键:6,指针:0x5605809da3c0键:7,指针:0x5605809da280键:8,指针:0x5605809da380键:9,指针:0x5605809da3e0键:10,指针:0x5605809da2c0键:12,指针:0x5605809da420键:14,指针:0x5605809da3a0键:15,指针:0x5605809da440键:16,指针:0x5605809da400键:17,指针:0x5605809da460。您有两次键0和11是missing@IeshaanSaxena我只是在ubuntu(64b)下做了一次尝试,一切正常,0键没有加倍(事实上你没有使用11键)。这意味着你没有做所有的事情changes@IeshaanSaxena我编辑了我的答案以放入所有源代码。我尝试了你编写的完整代码,我意识到我已经用
malloc
初始化了我的指针
root
。非常感谢。我在Ubuntu中返回
saver
键0,指针:0x5605809da260键0,指针:0x5605809da360键1,指针:0x5605809da320键2,指针:0x5605809da340键3,指针:0x5605809da2e0键4,指针:0x5605809da2a0键5,指针:0x5605809da300键6,指针:0x5605809da3c0键7,指针:0x5605809da280键:8,指针:0x5605809da380键:9,指针:0x5605809da3e0键:10,指针:0x5605809da2c0键:12,指针:0x5605809da420键:14,指针:0x5605809da3a0键:15,指针:0x5605809da440键:16,指针:0x5605809da400键:17,指针:0x5605809da460。您有两次键0和11是missing@IeshaanSaxena我只是在ubuntu(64b)下做了一次尝试,一切正常,0键没有加倍(事实上你没有使用11键)。这意味着你没有做所有的事情