二叉树递归和迭代分别实现三种遍历

定义

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; //初始化nodeMAX变量为为系统(int)最小值
int curLevel = 1; //表示目前所正在遍历的层数
int curLevelNodes = 0; //表示目前层数的结点数量
levelMap[&head] = 1; //初始化头节点为第一层,任意子节点为头节点+1层
while (!que.empty()) {
Node* p = que.front();
que.pop();
// cout << p->value << ' '; //打印树
int nodeLevel = levelMap[p]; //每次查询结点的层数
// cout << "LEVEL: " << nodeLevel << endl;
if (nodeLevel == curLevel) {
curLevelNodes++;
// cout << "curLevelNodes Updata: " << curLevelNodes << endl;
} else {
// cout << "else > curLevelNodes: " << curLevelNodes << endl;
nodeMAX = max(nodeMAX, curLevelNodes);
// cout << "nodeMAX: " << nodeMAX << endl;
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;
posted @   IoOozZzz  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示