二叉树中序遍历代码解析及完整主函数示例
此代码为二叉树的中序遍历,输出结果为二叉树中每个节点的值。
完整的主函数代码:
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) 函数使用递归实现中序遍历,其逻辑如下:
- 如果当前节点不为空,则先递归遍历左子树 (InOrder(tree->Lsubtree));
- 访问当前节点 (Access(tree->data));
- 递归遍历右子树 (InOrder(tree->Rsubtree))。
*InOrder2(TNode tree) 函数使用非递归实现中序遍历,其逻辑如下:
- 初始化一个栈 S;
- 使用一个指针 p 指向当前节点,从树根节点开始;
- 如果当前节点 p 不为空,则将其压入栈 S 中,并继续遍历其左子树;
- 如果栈 S 不为空,则弹出栈顶节点 p,访问其数据,并遍历其右子树;
- 重复步骤 3-4 直到栈 S 为空且当前节点 p 为空。
两种实现方法均可以实现二叉树的中序遍历,其中递归实现代码更加简洁易懂,而非递归实现则更节省空间和时间。
原文地址: https://www.cveoy.top/t/topic/nRIM 著作权归作者所有。请勿转载和采集!