C语言中序遍历非递归算法

想问一下这个,假如当p遍历到左子树中的最后一个结点,然后结点后就是NULL,那再转入if中,p->rchild不还是NULL吗?那这个循环有什么意义呀

img

外层循环的意义是保证每个节点都会访问到,所以它的循环条件是栈不为空,p指针不为空;
内层while是为了在处理p节点之前,先将p的左下节点存入栈中
当p遍历到左子树中的最后一个结点,然后结点后就是NULL,那再转入if中,首先有一个出栈的操作,这个时候p不是NULL, 而是栈顶的元素,
这就是栈顶元素的左边都处理完了,然后处理了下栈顶元素,再转p->rchild。这就保证了中序遍历。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/1100001
  • 除此之外, 这篇博客: 数据结构学习,双向链表中的 返回p结点的直接后继的指针,若p结点是尾结点则返回NULL 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • DuLNode* NextElem_Dul(DuLNode* p)
    {
    	if (p == NULL)
    	{
    		return NULL;
    	}
    	else
    	{
    		return p->next;
    	}
    }