一、第一种
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct Node{
Node* left;
Node* right;
int val;
Node(int v):left(nullptr),right(nullptr),val(v){}
Node(Node* l,Node* r,int v):left(l),right(r),val(v){}
};
int height(Node* root){
if(root == nullptr) return 0;
return max(height(root->left),height(root->right)) + 1;
}
void TraverseByLevel(Node* root,int level,vector<int>& c){
if(level == 0){
c.push_back(root->val);
return;
}
TraverseByLevel(root->left,level-1,c);
TraverseByLevel(root->right,level-1,c);
}
int main(){
Node* root = new Node(1);
root->left = new Node(2);
root->right = new Node(3);
vector<vector<int>> tree(height(root));
for(int h = 0; h < height(root); h++){
vector<int> c;
TraverseByLevel(root,h,c);
tree[h] = c;
}
for(auto l:tree){
for(int node:l)
cout<<node<<" ";
cout<<'\n';
}
return 0;
}
二、第二种(个人觉得这种更漂亮)
#include<iostream>
#include<vector>
using namespace std;
struct Node{
Node* left;
Node* right;
int val;
Node(int v):left(nullptr),right(nullptr),val(v){}
Node(Node* l,Node* r,int v):left(l),right(r),val(v){}
};
void TraverseByLevel(vector<int> tree[],Node* root,int dep){
if(root == NULL) return;
tree[dep].push_back(root->val);
TraverseByLevel(tree,root->left,dep+1);
TraverseByLevel(tree,root->right,dep+1);
}
int main(){
Node* root = new Node(1);
root->left = new Node(2);
root->right = new Node(3);
vector<int> tree[2];
TraverseByLevel(tree,root,0);
for(auto l:tree){
for(int node:l)
cout<<node<<" ";
cout<<'\n';
}
return 0;
}