在开始学习堆栈和队列的时候,若是用链表来存储。那么在最开始创建(以堆栈为例)的时
候,老师会说先建立一个空结点,在这个空结点的基础上进行插入删除的操作(理由是这样会方便
点),本人当时愚见是进行插入时就不用判断头指针是否为空或者删除时不用让尾指针指向
NULL。直到现在创建树这块没有用空结点出问题才理解了 老师所谓的方便:
先看堆栈的结构定义:
这是部分函数:
我们先建立一个空结点,让堆栈Stack指向这个空结点。压栈函数将所需要压入的元素压入堆栈。
当我用差不多的思想应用于二叉搜索树的插入时(没有建立空结点,直接以树根代表该树)
这是main()函数中的具体操作:
出问题了,当本人尝试打印该树时,发现什么都没有。说明构建过程出了问题。
就是因为一开始没有设立空结点,让树根直接为NULL这块出了问题,回到Insert函数。我们传进去
的是空树,在函数内部让其指向新的地址是无效的。因为c语言是函数参数传值。这就相当于在函
数内部复制了一个空树,对复制的空树做一系列的操作。但是原来的树并没有改变。为解决该问
题。有3种方法:
1. 让原来的空树接收函数的返回值,即for循环最后一行改为 BST = Insert(c,BST);
2. 函数参数传值时传BST的指针;
3. BST一开始指向一个空结点,然后就可以完成。
因为如果树有了指向的结点,即不空,那么我们就不需要在函数内部改变树的指向,那么就可以根
据空结点为基础,对该树进行操作。