二叉树递归和迭代分别实现三种遍历
定义
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;

浙公网安备 33010602011771号