算法-二叉树:前、中、后序的迭代遍历
使用栈可以实现迭代遍历。
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int val) : val(val),left(nullptr),right(nullptr) {}
};
//前序遍历
void traversalQx(TreeNode* root,vector<int>& result){
if(root == NULL) return;
stack<TreeNode*> st;
st.push(root);//把根节点推进栈
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);//直接把中间的节点存入结果中
if(node->right)
st.push(node->right);//先放右孩子
if(node->left)
st.push(node->left);//后放左孩子
}
}
//中序遍历:左中右,先借用指针来遍历到最左面的底部节点,再用栈开始处理。
void traversalZx(TreeNode* root,vector<int>& result){
if(root == NULL) return;
stack<TreeNode*> st;//只存左子树
TreeNode* cur = root;//用于遍历
while (cur!=NULL || !st.empty()) {
if(cur != NULL){ //遍历到最左边的节点
st.push(cur); //将左孩子的节点们都入栈
cur = cur->left;
}
else{
cur = st.top();
st.pop();
result.push_back(cur->val);//中
cur = cur->right;
}
}
}
//后序遍历:前序遍历中左右,调整前序遍历顺序为中右左,反转result数组变成左右中
void traversalHx(TreeNode* root,vector<int>& result){
if(root == NULL) return;
stack<TreeNode*> st;
st.push(root);//把根节点推进栈
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);//直接把中间的节点存入结果中
if(node->left)
st.push(node->left);//先放左孩子
if(node->right)
st.push(node->right);//后放右孩子
}
reverse(result.begin(), result.end());
}
//构建一颗二叉树
TreeNode* initTree(vector<int> nums){
int n = nums.size();
if(n < 1)
return NULL;
TreeNode **nodes = new TreeNode*[n];//动态申请n大小的指针数组
for(int i = 0; i < n; i++){
if(nums[i] == 0){ //用0表示空值
nodes[i] = NULL;
}
else{
nodes[i] = new TreeNode(nums[i]);
}
}
TreeNode* node;
queue<TreeNode *> queNode;//队首为父节点,队尾两个为左右节点
queNode.push(nodes[0]);//根节点进去
int index = 1;
while (index < n) {
node = queNode.front();
while(node == NULL){ //node有可能是空
queNode.pop();
node = queNode.front();
}
queNode.pop();//弹出父节点
queNode.push(nodes[index++]);
node->left = queNode.back();
if(index >= n) break; //上一步index自增之后有可能不满足index<n的条件
queNode.push(nodes[index++]);
node->right = queNode.back();
}
return nodes[0];
}
int main(){
vector<int> nums = {1,2,3,0,5,6};
TreeNode* root = initTree(nums); //构建二叉排序树
//打印
vector<int> resQx;
traversalQx(root,resQx);
cout<<"前序遍历结果:";
for(int i = 0; i < resQx.size(); i++){
cout<<resQx[i]<<" ";
}
cout<<endl;
vector<int> resZx;
traversalZx(root,resZx);
cout<<"中序遍历结果:";
for(int i = 0; i < resZx.size(); i++){
cout<<resZx[i]<<" ";
}
cout<<endl;
vector<int> resHx;
traversalHx(root,resHx);
cout<<"后序遍历结果:";
for(int i = 0; i < resHx.size(); i++){
cout<<resHx[i]<<" ";
}
cout<<endl;
return 0;
}
输出结果为:
前序遍历结果:1 2 5 3 6
中序遍历结果:2 5 1 6 3
后序遍历结果:5 2 6 3 1