二叉树
结构描述:
| #include <iostream> |
| #include <queue> |
| |
| using namespace std; |
| |
| typedef int DataType; |
| |
| class Node { |
| private: |
| DataType data; |
| Node * left; |
| Node * right; |
| friend class BinaryTree; |
| }; |
| |
| typedef class BinaryTree { |
| private: |
| Node * root; |
| |
| void preOrderTraverse(const Node * root); |
| |
| void inOrderTraverse(const Node * root); |
| |
| void postOrderTraverse(const Node * root); |
| |
| void levelOrderTraverse(const Node * root); |
| |
| void MakeEmpty(const Node * root); |
| public: |
| |
| BinaryTree() { |
| root = nullptr; |
| } |
| |
| Node * buyNode(DataType x); |
| |
| void createManual(); |
| |
| void preOrderTraverse(); |
| |
| void inOrderTraverse(); |
| |
| void postOrderTraverse(); |
| |
| void levelOrderTraverse(); |
| |
| |
| void MakeEmpty(); |
| }BT; |
前序遍历
- 树空:返回空
- 非空:
- 处理根节点
- 处理左子树
- 处理右子树
| void BT::preOrderTraverse(const Node * root) { |
| if (root == nullptr) { |
| return; |
| } |
| |
| cout << root->data << " "; |
| preOrderTraverse(root->left); |
| preOrderTraverse(root->right); |
| } |
中序遍历
- 树空:返回空
- 非空:
- 处理左子树
- 处理根节点
- 处理右子树
| void BT::inOrderTraverse(const Node * root) { |
| if (root == nullptr) { |
| return; |
| } |
| |
| inOrderTraverse(root->left); |
| cout << root->data << " "; |
| inOrderTraverse(root->right); |
| } |
后序遍历
- 树空:返回空
- 非空:
- 处理左子树
- 处理右子树
- 处理根节点
| void BT::postOrderTraverse(const Node * root) { |
| if (root == nullptr) { |
| return; |
| } |
| |
| postOrderTraverse(root->left); |
| postOrderTraverse(root->right); |
| cout << root->data << " "; |
| } |
层序遍历
- 树空:返回空
- 非空:
- 先把根节点入队,然后进入循环,对队列进行操作。
- 获取队头元素并输出;
- 判断节点的左右子节点是否存在,存在则入队;
- 把队头元素出队
- 重复2,3,4步操作,直至队空
| void BT::levelOrderTraverse(const Node * root) { |
| if (root == nullptr) { |
| return; |
| } |
| |
| |
| queue<const Node *> qn; |
| const Node * cur; |
| |
| qn.push(root); |
| |
| |
| while (!qn.empty()) { |
| |
| cur = qn.front(); |
| |
| cout << cur->data << " "; |
| |
| if (cur->left != nullptr) { |
| qn.push(cur->left); |
| } |
| if (cur->right != nullptr) { |
| qn.push(cur->right); |
| } |
| |
| qn.pop(); |
| } |
| } |
销毁二叉树
- 树空:返回
- 非空:同层序遍历,但是在循环末尾处翻译节点
| void BT::MakeEmpty(const Node * root) { |
| if (root == nullptr) { |
| return; |
| } |
| |
| |
| queue<const Node *> qn; |
| const Node * cur; |
| |
| qn.push(root); |
| |
| |
| while (!qn.empty()) { |
| |
| cur = qn.front(); |
| |
| if (cur->left != nullptr) { |
| qn.push(cur->left); |
| } |
| if (cur->right != nullptr) { |
| qn.push(cur->right); |
| } |
| cout << cur->data; |
| |
| delete cur; |
| cur = nullptr; |
| cout << " as been poped!\n"; |
| |
| qn.pop(); |
| } |
| |
| cout << "Make Empty Successfully!\n"; |
| } |
踩坑记录
在private和public中分别写上遍历函数,具体实现放在private中实现,用public中的函数调用即可。
但是名字是一样的时候,注意二者的参数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架