当前位置: 首页 > 知识库问答 >
问题:

二叉树只添加到根

严阳秋
2023-03-14

我正在用C编写一个简单的二叉树程序,现在它只存储在根节点输入的最新值,例如,如果我在树中输入10,然后在树中输入9,那么9只是覆盖10作为根节点,所以树只存储值9。

我在网上查看了多个C二叉树解决方案,并尝试了它们的实现版本,但仍然没有成功。

这是树中单个节点的结构

struct TreeNode{

    int value;
    TreeNode *left;
    TreeNode *right;

    TreeNode(int value){

        this -> value = value;
        left = NULL;
        right = NULL;

    }
};

到目前为止,我的二叉树课程

class IntTree{

private :

    TreeNode *root;

public :

    IntTree();
    TreeNode* getRoot();
    void insertValue(TreeNode *root, int intValue);
    TreeNode* searchTree(TreeNode *root, int intValue);
    void inOrder(TreeNode *root);
    void deleteValue(int intValue);
    void deleteTree(TreeNode *root);

};

插入方法

void IntTree::insertValue(TreeNode *root, int intValue){


if(root == NULL){

    root = new TreeNode(intValue);

}

else if(intValue == root->value){

    cout << "Value already exists in the tree" << endl;

}

else if(intValue < root->value){

    insertValue(root->left, intValue);

}

else{

    insertValue(root->right, intValue);

}   
}

然后在这样的菜单中调用这个方法

cout << "Enter Value to Insert : " << endl;
input = readInt();
theTree.insertValue(theTree.getRoot(), input);

逻辑对我来说似乎都很好,除了我尝试不使用构造函数而只是单独设置变量,有两个函数用于插入一个只有 int 参数的函数,所以我不必使用 getRoot()后来和我忘记的其他一百万件事

共有2个答案

耿联
2023-03-14

这应该有效:

新的insertvalue函数调用如下所示

void insertValue(TreeNode **root, int intValue)
{
  if(*root == NULL)
  {
      *root = newNode(intValue);
  }
  else if(intValue == (*root)->value)
  {
     cout << "Value already exists in the tree" << endl;
  }
  else if(intValue < (*root)->value)
  {
    insertValue(&(*(root))->left, intValue);
  }
  else
  {
    insertValue(&(*(root))->right, intValue);
  }   
}
int main()
{
    //initial code
    insertvalue(&root,value) //root is a single pointer variable.
    //code for printing the tree
}

有许多不那么复杂的方法来实现同样的功能。我刚刚修改了你的代码。

宋飞文
2023-03-14

答案很简单,你正在修改的指针只是一个副本,所以副本在函数结束时被丢弃,你已经失去了内存。您需要对指针进行引用才能实际修改它(无需修改其他内容):

void insertValue(TreeNode *& root, int intValue)
 类似资料:
  • 我正在将以下数据作为赋值的一部分读取到二叉树(不是严格的二叉查找树)中: 它们被读取到python、和中的三个列表中,其中第一行具有整数是节点数。接下来的n行是键,左,右。其中左是父级左子级的键是,同样右子级的键是,因此例如第一行是4的键是根,意味着2是4的左子级,意味着5是4的右子级,以此类推,-1代表左右意味着这个键是叶子: 此示例的树结构 问题是正在添加根的左右子节点,但没有添加其中的任何子

  • 二叉树 二叉树采用二叉链表存储,要求根据给定的先序遍历序列和中序遍历序列建立二叉树,并输出后序遍历序列、结点总数、叶子数、度为1的结点数、度为2的结点数。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据的第一行输入结点数n(1≤n≤10),第二、三行各输入n个整数,分别表示二叉树的先序遍历序列和中序遍历序列。 输出格式: 对于每组测试,在一行上分别输出该二叉树的后序遍历序列,结点总数,叶子

  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • 树的特征和定义 树(Tree)是元素的集合。我们先以比较直观的方式介绍树。下面的数据结构是一个树: 树有多个节点(node),用以储存元素。某些节点之间存在一定的关系,用连线表示,连线称为边(edge)。边的上端节点称为父节点,下端称为子节点。树像是一个不断分叉的树根。 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent)。比如说,3,5是6的子节点,6是3,

  • 2. 二叉树 2.1. 二叉树的基本概念 链表的每个节点可以有一个后继,而二叉树(Binary Tree)的每个节点可以有两个后继。比如这样定义二叉树的节点: typedef struct node *link; struct node { unsigned char item; link l, r; }; 这样的节点可以组织成下图所示的各种形态。 图 26.9. 二叉树的定义和举例 二叉树可

  • 我试图为我的BST做一个递归加法。public add方法接受一个int参数,private方法接受相同的int和一个节点。这是我目前掌握的代码 我经常得到空指针,也尝试过调试,但我的逻辑中有一些我看不到的缺陷。