二叉树中序遍历算法:递归与非递归实现

二叉树的中序遍历是指按照左子树、根节点、右子树的顺序访问树中的所有节点。本文将介绍两种实现中序遍历的方法:递归和非递归。

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. 循环执行步骤 1 和 2,直到栈为空且当前节点为空。

3. 主函数代码

int main() {
  TNode* tree = createTree(); // 假设已经创建了一棵二叉树
  InOrder1(tree); // 使用递归方法中序遍历
  InOrder2(tree); // 使用非递归方法中序遍历
  return 0;
}

该函数首先创建一棵二叉树,然后分别调用递归和非递归方法进行中序遍历。

注意: 由于 createTree() 函数未提供,你需根据实际情况补充代码。

总结

本文介绍了二叉树中序遍历的两种实现方式:递归和非递归。递归方法简洁易懂,但可能会导致栈溢出;非递归方法使用栈来模拟递归过程,可以避免栈溢出,但代码相对复杂。你可以根据具体情况选择合适的实现方式。

二叉树中序遍历算法:递归与非递归实现

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

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