题目来源
题目描述
题目解析
- 思路:
- 它是一个完全二叉树,所以我们用数组来存储它。而且数组的第0位不用,那么对于每一个数,它的左右子节点的索引分别是2 * i,2 * i + 1
- 然后我们递归:
- 一般二叉树的遍历流程:
- 检测当前节点是不是NULL,如果是,那么直接返回
- 否则:
- 处理左子树
- 处理右子树
- 打印当前值
- 那么,对于本题,我们不处理叶子节点就好啦:
- 检测当前节点是不是NULL,如果是,那么直接返回
- 检测当前节点是不是叶子节点,如果是,那么直接返回
- 否则:
- 处理左子树
- 处理右子树
- 打印当前值
- 一般二叉树的遍历流程:
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <functional>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <map>
#include <random>
#include <ctime>
#include <iterator>
using namespace std;
class Solution{
bool isLeaf(std::vector<int> &nums, int i){
return (2 * i >= nums.size()) && (2 * i + 1 >= nums.size());
}
// 节点从1开始,索引0不存
void postOrder(std::vector<int> & num, int i){
// 当前节点超出索引
if(i >= num.size()){
return;
}
//当前节点是不是叶子节点(如果是,什么也不干)
if(isLeaf(num, i)){
return;
}
// 如果不是
// 处理左右节点
postOrder(num, 2 * i);
postOrder(num, 2 * i + 1);
// 打印当前值
printf("%d\t", num[i]);
}
std::vector<int> split(std::string str){
std::vector<int> ans{0};
int j = 0;
for (int i = 0; i < str.size(); ++i) {
if(str[i] == ' '){
ans.push_back(stoi(str.substr(j, i - j)));
j = i + 1;
}
}
return ans;
}
public:
void process(std::string str){
auto vec = split(str);
postOrder(vec, 1);
}
};
int main(){
std::string str = "1 2 3 4 5 6 7";
getline(std::cin, str);
Solution a;
a.process(str);
}