C语言实现二叉树迭代遍历:中序、前序、后序

0 下载量 160 浏览量 更新于2024-08-29 收藏 40KB PDF 举报
"本文主要介绍了如何使用C语言实现二叉树的三种遍历方式——中序遍历、先序遍历和后序遍历的迭代算法。这些算法在数据结构和算法领域中具有重要意义,有助于理解和操作二叉树结构。通过实例代码,详细展示了每个遍历过程的实现步骤。" 在C语言中,二叉树遍历是一种常见的操作,用于访问二叉树的所有节点。通常,有三种基本的遍历方法:中序遍历、先序遍历和后序遍历。 1. 中序遍历(In-order Traversal): 中序遍历通常按照左子树-根节点-右子树的顺序访问节点。在迭代实现中,可以使用栈来辅助遍历。首先将根节点的父节点保存,然后将根节点及其所有左子节点压入栈中。当栈不为空时,弹出栈顶节点,访问该节点,然后将该节点的右子节点压入栈中。这样,每次访问的都是当前节点的左子树的最右侧节点,直到整个子树被遍历。 ```cpp void inorder(Node* root) { if (root == NULL) return; stack<Node*> nstack; Node* node = root; while (node != NULL || !nstack.empty()) { while (node != NULL) { nstack.push(node); node = node->left; } node = nstack.top(); nstack.pop(); cout << node->item << ""; node = node->right; } } ``` 2. 先序遍历(Pre-order Traversal): 先序遍历的顺序是根节点-左子树-右子树。迭代实现时,同样利用栈来辅助。首先访问根节点,然后将根节点及其所有子节点(左子节点优先)压入栈中,直到遍历到叶子节点。然后回溯,访问右子节点并重复此过程。 ```cpp void preorder(Node* root) { if (root == NULL) return; stack<Node*> nstack; nstack.push(root); while (!nstack.empty()) { Node* node = nstack.top(); nstack.pop(); cout << node->item << ""; if (node->right != NULL) nstack.push(node->right); if (node->left != NULL) nstack.push(node->left); } } ``` 3. 后序遍历(Post-order Traversal): 后序遍历遵循左子树-右子树-根节点的顺序。对于迭代实现,可以使用两个栈,一个用于存储节点,另一个用于记录已访问的节点。首先将根节点压入栈中,然后检查栈顶元素是否已访问过,若未访问则将其左右子节点压入栈中,若已访问则弹出栈顶元素并访问。这个过程需要维护一个已访问的标志。 ```cpp void postorder2(Node* root) { if (root == NULL) return; stack<Node*> nstack, vstack; Node* pre = NULL; nstack.push(root); while (!nstack.empty()) { Node* node = nstack.top(); nstack.pop(); vstack.push(node); if (node->left != NULL) nstack.push(node->left); if (node->right != NULL) nstack.push(node->right); } while (!vstack.empty()) { Node* node = vstack.top(); vstack.pop(); if (node->left == pre || node->right == pre) { cout << node->item << ""; pre = node; } } } ``` 以上代码示例展示了如何使用C语言实现二叉树的三种迭代遍历。在实际应用中,可以根据需要选择适合的遍历方式,例如,中序遍历常用于查找排序二叉树,先序遍历可用于复制二叉树,而后序遍历在构建表达式树等场景中非常有用。理解并掌握这些遍历算法,对于进行二叉树相关的数据处理和算法设计至关重要。