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

定义

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 @ 2024-03-17 18:35  IoOozZzz  阅读(36)  评论(0)    收藏  举报  来源