如果要求只能用非递归方法,同时还不让用栈,来遍历完全二叉树,则每个结点必须有一个指向父结点的指针。
题目:
完全二叉树,采用三叉链表结构。
要求 不用递归,中序遍历这棵树。要求空间复杂度是O(1).
分析:题目不让用递归,那就用迭代,同时,空间复杂度是常量级,摆明了不让用栈。
那就必须是三叉链表了。三叉链表是二叉树的另一种主要的链式存储结构。三叉链表与二叉链表的主要区别在于,它的结点比二叉链表的结点多一个指针域,该域用于存储一个指向本结点双亲的指针。
有了父指针,那就用父指针来进行回溯。
感觉不难,理清思路后比较简单。先写一个,明天看看对不对。
题目:
完全二叉树,采用三叉链表结构。
要求 不用递归,中序遍历这棵树。要求空间复杂度是O(1).
分析:题目不让用递归,那就用迭代,同时,空间复杂度是常量级,摆明了不让用栈。
那就必须是三叉链表了。三叉链表是二叉树的另一种主要的链式存储结构。三叉链表与二叉链表的主要区别在于,它的结点比二叉链表的结点多一个指针域,该域用于存储一个指向本结点双亲的指针。
有了父指针,那就用父指针来进行回溯。
感觉不难,理清思路后比较简单。先写一个,明天看看对不对。
void InOrder_iteration_withoutStack(TriTreePtr T)
{
TriTreePtr pre, cur;
cur = T;
while(nullptr != cur)
{
//遇到左子结点,则一直向左
while(nullptr != cur->lchild)
cur = cur->lchild;
//此时该结点的左子树为空
//输出该结点
endl(std::cout << cur->data);
//如果结点有右子树
//进入右子树,然后探索左子树
if(nullptr != cur->rchild)
{
cur = cur->rchild;
continue;
}
else //否则,就要向上回溯
{
pre = cur;
cur = cur->pare