算法-二叉树:前、中、后序的递归遍历
#include <iostream>
#include <vector>
#include <queue>
#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* cur,vector<int>& result){
if(cur == NULL) return;
result.push_back(cur->val);
traversalQx(cur->left, result);
traversalQx(cur->right, result);
}
//中序递归遍历
void traversalZx(TreeNode* cur,vector<int>& result){
if(cur == NULL) return;
traversalZx(cur->left, result);
result.push_back(cur->val);
traversalZx(cur->right, result);
}
//后序递归遍历
void traversalHx(TreeNode* cur,vector<int>& result){
if(cur == NULL) return;
traversalHx(cur->left, result);
traversalHx(cur->right, result);
result.push_back(cur->val);
}
//构建一颗二叉树
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;
}