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

c - 数据结构创建二叉树为什么直接修改T指针(以后遍历T还指向根节点吗)?

邬宏扬
2023-08-27

这里Bitree本来就是一个指针类型,传入T的地址直接修改T和单链表用p指向新增节点不一样啊

void create(Bitree* T){    char a;    scanf_s("%c", &a);    if (a == '#')        (*T) = NULL;    else    {        (*T) = (Bitree*)malloc(sizeof(Bitree));        (*T)->a = a;        create(&(*T)->leftchild);        create(&(*T)->rightchild);    }

共有1个答案

家志学
2023-08-27

因为你的代码中T的传入,并不是t这个指针本身,而是传入的是T的地址,即指向T指针的指针(可能这句话有点绕,你好好冷静想想指针的概念)。通过修改T指针,实际上是修改了T指针所指向的内存地址上的内容,即二叉树节点的指针。这样做的目的是为了在递归构建二叉树时能够正确地连接各个节点。

想明白了上面的道理,我们口述下你的代码的运行逻辑,你可能更容易理解,在代码中,首先通过输入读取一个字符a,如果a等于"#",表示当前节点为空,将T指针设为NULL。否则,创建一个新的二叉树节点,并将字符a赋值给该节点的数据域a。然后,递归调用create函数来分别构建左子树和右子树,传入的参数是左子树和右子树节点的指针的地址,从而可以在递归中修改它们的指针。

将输入的一串字符按照特定规则构建成一棵二叉树,并通过T指针指向根节点。之后,可以使用T指针进行二叉树的遍历等操作(因为T指针一直指向根节点,没有被修改过)

 类似资料:
  • 我在研究二叉树。我找到了在树中插入节点的代码。这里“root”是类“TreeType”中结构类型的指针变量,作为“private member”。 在这个函数中,“根”是通过引用传递的,所以在“插入”函数中,“树”中的任何变化也会导致“根”的变化。如果我们再次调用插入函数,根将指向最后一个节点还是指向第一个节点?所以,根据我的说法,当它指向最后一个节点时,插入函数将不再工作。有人能帮忙吗?

  • 这是一个相当简单的问题,我注意到当我表示一棵树时,无论我用哪种方式(后排序,按顺序,前排序)树叶总是以相同的顺序出现,从左到右。 我只是想知道为什么,这是有原因的吗? 我刚开始研究它们,就想到了这个。 编辑: 我有一棵这样的树: 叶节点为:D、E和F 预购顺序为:A、B、D、C、E、F 顺序是:D,B,A,E,C,F 后序是:D,B,E,F,C,A 叶子节点总是从左到右出现,不管我选择哪个顺序,问

  • 我正在学习链表,以及如何在C中使用结构和指针创建链表。下面我举一个例子。据我所知,被调用的将头节点所在的结构的开始内存位置作为参数传递。push()函数的参数将结构节点作为指向指针的指针,因此它作为引用传递,而不是实际副本。因此,我们的的第一个指针只是指向头部节点的内存位置的指针,第二个指针指向该值,该值是头部节点指向的下一个内存位置。我们通过为结构节点分配一些内存,在结构节点内创建一个名为new

  • 我现在正在实现模拟N体问题的Barnes-Hut算法。我只想问关于建筑树的部分。 我做了两个函数来为它构建树。 我递归地构建树,并在构建时打印每个节点的数据,一切看起来都是正确的,但当程序返回到主函数时,只有树的根和根的子节点存储值。其他节点的值没有被存储,这很奇怪,因为我在递归过程中打印了它们,它们应该被存储。 这是经过修改的代码的一部分,我认为问题可能在哪里: 下面是函数set_root_an

  • 本文向大家介绍详解C++中的指针结构体数组以及指向结构体变量的指针,包括了详解C++中的指针结构体数组以及指向结构体变量的指针的使用技巧和注意事项,需要的朋友参考一下 C++结构体数组 一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组的不同之处在于:每个数组元素都是一个结

  • 本文向大家介绍JavaScript数据结构之二叉树的遍历算法示例,包括了JavaScript数据结构之二叉树的遍历算法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript数据结构之二叉树的遍历算法。分享给大家供大家参考,具体如下: 三种遍历的代码: 最后是实验代码: 树的结构为:                     23            16