此代码为二叉树的中序遍历,输出结果为二叉树中每个节点的值。

完整的主函数代码:

void InOrder(TNode *tree)
{
    if (tree != NULL)
    {
        InOrder(tree->Lsubtree);
        Access(tree->data);
        InOrder(tree->Rsubtree);
    }
}

void InOrder2(TNode *tree)
{
    TNode *p = tree;
    InitStack(S);
    do {
        while (p != NULL)
        {
            PushStack(S, p);
            p = p->Lsubtree;
        }
        if (!EmptyStack(S))
        {
            p = PopStack(S);
            Access(p->data);
            p = p->Rsubtree;
        }
    } while (!EmptyStack(S) || p != NULL);
}

代码分析:

*InOrder(TNode tree) 函数使用递归实现中序遍历,其逻辑如下:

  1. 如果当前节点不为空,则先递归遍历左子树 (InOrder(tree->Lsubtree));
  2. 访问当前节点 (Access(tree->data));
  3. 递归遍历右子树 (InOrder(tree->Rsubtree))。

*InOrder2(TNode tree) 函数使用非递归实现中序遍历,其逻辑如下:

  1. 初始化一个栈 S;
  2. 使用一个指针 p 指向当前节点,从树根节点开始;
  3. 如果当前节点 p 不为空,则将其压入栈 S 中,并继续遍历其左子树;
  4. 如果栈 S 不为空,则弹出栈顶节点 p,访问其数据,并遍历其右子树;
  5. 重复步骤 3-4 直到栈 S 为空且当前节点 p 为空。

两种实现方法均可以实现二叉树的中序遍历,其中递归实现代码更加简洁易懂,而非递归实现则更节省空间和时间。

二叉树中序遍历代码解析及完整主函数示例

原文地址: https://www.cveoy.top/t/topic/nRIM 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录