C++树的遍历

本文展示了一个简单的二叉树构建过程,并通过递归方式实现了遍历输出。从根节点开始,逐步创建左右子树及更深层次的节点,最终形成一棵完整的二叉树结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

这里是树的类

由于初学,这个树就是纯手工完成了,呵呵!

### C++遍历的实现 在 C++ 编程中,是一种重要的非线性数据结构。为了访问中的每一个节点并执行特定操作,通常采用四种主要的遍历方式:前序遍历、中序遍历、后序遍历和层序遍历。这些方法可以通过递归或迭代的方式实现。 #### 前序遍历(Pre-order Traversal) 前序遍历按照 **根 -> 左子 -> 右子** 的顺序访问节点。以下是基于递归的实现: ```cpp void preOrderTraversal(TreeNode* root) { if (root == nullptr) return; std::cout << root->val << " "; // 访问当前节点 preOrderTraversal(root->left); // 遍历左子 preOrderTraversal(root->right); // 遍历右子 } ``` 如果希望使用非递归的方法,则可以借助栈来模拟递归过程[^3]: ```cpp void iterativePreOrder(TreeNode* root) { if (!root) return; std::stack<TreeNode*> s; s.push(root); while (!s.empty()) { TreeNode* node = s.top(); s.pop(); std::cout << node->val << " "; if (node->right) s.push(node->right); if (node->left) s.push(node->left); } } ``` --- #### 中序遍历(In-order Traversal) 中序遍历遵循 **左子 -> 根 -> 右子** 的顺序。递归版本如下所示: ```cpp void inOrderTraversal(TreeNode* root) { if (root == nullptr) return; inOrderTraversal(root->left); // 遍历左子 std::cout << root->val << " "; // 访问当前节点 inOrderTraversal(root->right); // 遍历右子 } ``` 同样也可以通过栈完成非递归版的中序遍历: ```cpp void iterativeInOrder(TreeNode* root) { std::stack<TreeNode*> stack; TreeNode* current = root; while (current != nullptr || !stack.empty()) { while (current != nullptr) { stack.push(current); current = current->left; } current = stack.top(); stack.pop(); std::cout << current->val << " "; current = current->right; } } ``` --- #### 后序遍历(Post-order Traversal) 后序遍历按 **左子 -> 右子 -> 根** 的顺序处理节点。递归形式简单明了: ```cpp void postOrderTraversal(TreeNode* root) { if (root == nullptr) return; postOrderTraversal(root->left); // 遍历左子 postOrderTraversal(root->right); // 遍历右子 std::cout << root->val << " "; // 访问当前节点 } ``` 而非递归的形式则稍微复杂一些,需额外记录已访问过的节点状态: ```cpp void iterativePostOrder(TreeNode* root) { if (!root) return; std::stack<TreeNode*> s1, s2; s1.push(root); while (!s1.empty()) { TreeNode* temp = s1.top(); s1.pop(); s2.push(temp); if (temp->left) s1.push(temp->left); if (temp->right) s1.push(temp->right); } while (!s2.empty()) { std::cout << s2.top()->val << " "; s2.pop(); } } ``` --- #### 层次遍历(Level Order Traversal) 层次遍历也称为广度优先搜索(BFS),它逐层从上到下依次访问每一层上的所有节点。此算法常利用队列辅助实现: ```cpp #include <queue> void levelOrderTraversal(TreeNode* root) { if (!root) return; std::queue<TreeNode*> q; q.push(root); while (!q.empty()) { int size = q.size(); // 当前层的节点数量 for (int i = 0; i < size; ++i) { TreeNode* frontNode = q.front(); q.pop(); std::cout << frontNode->val << " "; if (frontNode->left) q.push(frontNode->left); if (frontNode->right) q.push(frontNode->right); } } } ``` 以上展示了如何用不同方式进行二叉遍历。每种遍历的时间复杂度均为 O(n),其中 n 是中节点的数量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值