二叉树的遍历
1:前序遍历
- 在这个图中,我们把1 ,2 ,4三个节点压入了栈中
- 在压入栈的时候,直接读取
- 然后我们把2弹出来
- 判断右边是不是为空,如果不为空
- 按照第一步的方法,以该节点为根节点,把左子节点压入栈中,压入的时候进行读取
- 如果为空,就什么都不做
- 判断右边是不是为空,如果不为空
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
// 我们使用非递归的方式
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
if(root == nullptr) return res;
stack<TreeNode*> mystack;
while(root != nullptr){
res.push_back(root->val);
mystack.push(root);
root = root->left;
}
while(!mystack.empty()){
TreeNode* temp = mystack.top();
mystack.pop();
if(temp->right != nullptr){
TreeNode* newNode = temp->right;
cout << newNode->val;
while(newNode != nullptr){
res.push_back(newNode->val);
mystack.push(newNode);
newNode = newNode->left;
}
}
}
for(int i = 0; i < res.size(); i++){
cout << res[i] << " ";
}
cout << endl;
return res;
}
};
2:中序遍历
- 结果是 4 2 6 5 7 1 3
- 将左子节点压入栈中,1,2,4
- 将他们弹出来,然后弹出来之后进行访问
// 在前序的基础上,压入的时候不进行遍历,弹出的时候进行遍历
3:后续遍历
- 结果是4 6 7 5 2 3 1
- 我们还是压入左子树
- 弹出了四
- 此时判断右子树没有,我们遍历4
- 弹出了二
- 此时右子树是有的,所以我们将5 和 6 进行弹入
- 弹出6,此时可以遍历
- 弹出5,此时右子树有7,什么时候进行打印呢??
——————————————————学习——————————————
- 栈和空的,root 不为空
- 将1,2,4压入到栈中
- 将4弹出来
- 判断4的右边是不是为空,或者是是不是上次的prev,为空,直接读取,将prev设置为4,root 设置为null
- 将2弹出来
- 判断2的右边不为空,
- 将2探进去,把5,6探进去
- 把6 弹出来
- 把5弹出来
- 右边的元素不是prev,所以要再弹出来
- 判断2的右边不为空,
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode *> mystack;
TreeNode* prev;
while(root != nullptr || !mystack.empty()){
while(root != nullptr){
mystack.push(root);
root = root->left;
}
root = mystack.top();
mystack.pop();
if(root->right == nullptr or root->right == prev){
res.push_back(root->val);
prev = root;
root = nullptr;
}
else{
mystack.push(root);
root = root->right;
}
}
return res;
}
};