美文网首页
二叉树建立,指针问题

二叉树建立,指针问题

作者: MisakaMikotoSAM | 来源:发表于2016-05-02 11:37 被阅读531次

我们对二叉树建立, 一般使用的方法是递归建立,这样的代码量最小,也最容易理解,但是这会牵扯到修改指针的值的问题,在看书中源码之时,我一直不太理解那段代码:

typedef struct BiTNode
{
       TElemType data;
       struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

void CreateBiTree(BiTree* T)                   //传入的是指向指针的指针
{
        TElemType ch;
        scanf("%c",&ch);
        if(ch == #')
        {
              *T = NULL;
        }
        else
        {
              *T = (BiTree )malloc( sizeof(BiTNode));
              (*T)->data = ch;
              CreateBiTree(&(*T)->lchild);
              CreateBiTree(&(*T)->rchild);
        }
}

我一直很好奇,为什么我需要在这个递归建立二叉树的函数中传入指针的指针,因为我认为,我只需要传入节点的孩子就可以了,不需要传入指向孩子的指针。

所以,很荣幸,程序马上就崩溃了,我经历过反复调试,才发现,原来节点的左右孩子指针完全没有改变,这时我才明白,为什么需要传入指向指针的指针,原来我需要在函数中改变指针的值,也就是对指针进行重新赋值,并且这个副作用需要影响到实参

这个程序加深了我对指针这个概念的理解,本身我对于指针的理解就是通过指针我可以改变指针指向的元素的值,而对于指针的指针我并不熟悉,因为我不清楚这个到底是需要使用在哪里。

如果你需要在函数中修改指针的值,而不是指针指向的元素的值,那么这个指针对于你来说就是一个元素,你在函数中获得的这个指针是原来指针的副本,只是指向同一个地址,所以你可以借助这个副本指针去修改实参中的值,但是你直接修改指针的值(改变指针指向的地址)是无法对实参产生影响的,因为他只是个副本指针

所以你想通过函数对指针的值进行修改,在C++中有下面两种做法:

void function1(int ** p)
{
//这里传入的是指向指针的指针
       (*p) = new int(5);          //修改指针指向的地址
}

void function2(int* (&p))
{
//这里传入的是指针的引用
        p = new int(5);            //通过引用与指针绑定,直接修改指针的值
}

在自行编写过树的代码后,我才意识的一句话,在C++中能使用引用的地方尽量使用引用。我们若是想使用指针来修改元素值,那么我们需要确定元素的实际地址才行,因为函数中传递进去只是实参的副本,而引用为我们提供了一种简便的方法,直接将实参与形参绑定,这样我们就可以直接修改形参来影响到实参。

相关文章

  • 二叉树建立,指针问题

    我们对二叉树建立, 一般使用的方法是递归建立,这样的代码量最小,也最容易理解,但是这会牵扯到修改指针的值的问题,在...

  • 一分钟读书俱乐部(十一):《区块链技术驱动金融》梅克尔树

    原文精选:另一个我们可以用哈希指针建立的有用的数据结构是二叉树。使用哈希指针的二叉树也叫作梅克尔树(Merkle ...

  • 2018-03-28 线索二叉树

    二叉树链表中有很多空指针,比如叶子节点,会有左右孩子两个空指针。如何把这些空指针利用起来呢?那就是线索二叉树 在这...

  • 二叉树的各种操作(递归和非递归遍历,树深度,结点个数等等)

    二叉树建立 先给出结点结构: 两种建立方式: 可以根据二叉树根节点和左右子结点的下标关系递归建立二叉树,层次输入二...

  • 作业1

    问题1 请设计一个算法,要求该算法把二叉树的叶子结点按从左到右的顺序连成一个单链表,表头指针为head。二叉树按二...

  • 数据结构与算法-线索二叉树

    线索二叉树 线索二叉树原理 通过观察上图可以看到,指针域利用的并不充分,有许多的"^",也就是空指针域的存在,这实...

  • 线索二叉树

    线索二叉树:在二叉树的基础上,为节点添加LTag和RTag标记,用于指示左指针和右指针指向的是左右孩子,或者是前驱...

  • 线索二叉树

    Overview 将二叉树中没有子节点的节点称为空指针域,利用二叉树的空指针域,按照前中后某种遍历方式存放对应的前...

  • 二叉搜索树的升级版

    二叉树存在的问题 在二叉树中,子节点的左孩子或者右孩子为NULL,或者两者都为空,有点浪费空间(一个空指针浪费了一...

  • 线索二叉树学习

    线索二叉树一、线索二叉树的原理 因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点。这种指针称为线索...

网友评论

      本文标题:二叉树建立,指针问题

      本文链接:https://www.haomeiwen.com/subject/gttlrttx.html