定义
| struct Node |
| { |
| int value; |
| Node* left; |
| Node* right; |
| Node(int v): value(v), left(NULL), right(NULL) {}; |
| }; |
一、递归遍历 🥰
递归先序遍历(左序遍历)
| inline void traverse(Node* head) |
| { |
| if (head == NULL) |
| { |
| return; |
| } |
| cout << head->value << ' '; |
| traverse(head->left); |
| traverse(head->right); |
| } |
理解之后,交换一下最后三行代码的顺序就能改成其他两种遍历。
二、迭代遍历 🤔
1.先序遍历(手动开栈)
过程演示(注意 18 处理的时候忘记弹出了)

代码
| stack<Node*> st; |
| st.push(&head); |
| while (!st.empty()) |
| { |
| Node* tem_head = st.top(); |
| cout << tem_head->value << ' '; |
| st.pop(); |
| if (tem_head->right != NULL) st.push(tem_head->right); |
| if (tem_head->left != NULL) st.push(tem_head->left); |
| } |
代码逻辑 :
- 手动定义一个栈
- 预处理,放入头节点
- 只要栈不为空,每次弹出栈顶结点,只要子节点不为空,就按照先右后左的顺序推入栈中。
2.中序遍历(手动开栈)
| Node* h = &head; |
| if (h != NULL) |
| { |
| stack<Node*> st; |
| while (h != NULL || !st.empty()) |
| { |
| if (h != NULL) |
| { |
| st.push(h); |
| h = h->left; |
| } |
| else |
| { |
| h = st.top(); |
| cout << h->value << ' '; |
| st.pop(); |
| h = h->right; |
| } |
| } |
| } |
代码逻辑 :
- 每次遍历左节点,直到遇到空结点
- 弹出并打印栈顶结点 栈顶结点就是最近的头结点
- 继续遍历栈顶结点的右结点,返回第一步
3.宽度优先遍历(利用队列)
宽度优先遍历就是从根节点往下,逐行遍历(从左向右)
| queue<Node*> que; |
| que.push(&head); |
| while (!que.empty()) |
| { |
| Node* p = que.front(); |
| que.pop(); |
| cout << p->value << ' '; |
| if (p->left != NULL) que.push(p->left); |
| if (p->right != NULL) que.push(p->right); |
| } |
4.扩展题目
找到二叉树每一层最大的结点数量
| |
| queue<Node*> que; |
| que.push(&head); |
| unordered_map<Node*, int> levelMap; |
| int nodeMAX = INT_MIN; |
| int curLevel = 1; |
| int curLevelNodes = 0; |
| levelMap[&head] = 1; |
| while (!que.empty()) { |
| Node* p = que.front(); |
| que.pop(); |
| |
| int nodeLevel = levelMap[p]; |
| |
| |
| if (nodeLevel == curLevel) { |
| curLevelNodes++; |
| |
| } else { |
| |
| nodeMAX = max(nodeMAX, curLevelNodes); |
| |
| curLevel++; |
| curLevelNodes = 1; |
| } |
| |
| if (p->left != NULL) { |
| que.push(p->left); |
| levelMap[p->left] = curLevel + 1; |
| } |
| |
| if (p->right != NULL) { |
| que.push(p->right); |
| levelMap[p->right] = curLevel + 1; |
| } |
| } |
| nodeMAX = max(curLevelNodes, nodeMAX); |
| cout << "result: " << nodeMAX << endl; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现