二叉树中序遍历算法:递归与非递归实现
二叉树中序遍历算法:递归与非递归实现
二叉树的中序遍历是指按照左子树、根节点、右子树的顺序访问树中的所有节点。本文将介绍两种实现中序遍历的方法:递归和非递归。
1. 递归方法
In0rder1(TNode *tree) {
if (tree != NULL) {
InOrder(tree->Lsubtree);
Access(tree->data);
InOrder(tree->Rsubtree);
}
}
该函数使用递归的方式遍历树。首先判断当前节点是否为空,若不为空,则递归遍历左子树,访问根节点,最后递归遍历右子树。
2. 非递归方法
In0rder2(TNode *tree) {
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);
}
该函数使用栈来模拟递归过程。首先将根节点入栈,然后不断循环执行以下步骤:
- 若当前节点不为空,则将当前节点入栈,并将当前节点指向其左子节点。
- 若栈不为空,则从栈顶取出一个节点,访问其数据,并将当前节点指向该节点的右子节点。
- 循环执行步骤 1 和 2,直到栈为空且当前节点为空。
3. 主函数代码
int main() {
TNode* tree = createTree(); // 假设已经创建了一棵二叉树
InOrder1(tree); // 使用递归方法中序遍历
InOrder2(tree); // 使用非递归方法中序遍历
return 0;
}
该函数首先创建一棵二叉树,然后分别调用递归和非递归方法进行中序遍历。
注意: 由于 createTree() 函数未提供,你需根据实际情况补充代码。
总结
本文介绍了二叉树中序遍历的两种实现方式:递归和非递归。递归方法简洁易懂,但可能会导致栈溢出;非递归方法使用栈来模拟递归过程,可以避免栈溢出,但代码相对复杂。你可以根据具体情况选择合适的实现方式。
原文地址: https://www.cveoy.top/t/topic/nRJc 著作权归作者所有。请勿转载和采集!