本题需要让你实现一个完全二叉树的翻转子树的操作。
给定一个N层的完全二叉树,根据从上到下、从左往右的顺序,对每个节点进行编号。如图1就
是一棵N为4的完全二叉树。
接下来再指定一个节点M,将该节点的两棵子树进行翻转(如果有的话)。如图2就是将节点
3 (即M为3)的两棵子树翻转后的结果。
输入描述:
每个测试输入包含1个测试用例
每个测试用例一行,用空格隔开的两个整数N和M,含义见题目描述,其中1<N<10,
0<M<2^(N-1)。
输出描述:
根据从_上到下、从左往右的顺序输出二叉树翻转后的结果,每行一个节点。
输入
4 3
输出
1
2
3
4
5
7
6
8
9
10
11
14
15
12
13
/*功能:*/
#include<bits/stdc++.h>
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) {}
};
void createtree(TreeNode* &rt, int num){
queue<TreeNode*> q;
rt = new TreeNode(1);
TreeNode* cur = rt;
q.push(cur);
for(int i = 2; i <= num;){
cur = q.front();
q.pop();
cur->left = new TreeNode(i++);
q.push(cur->left);
// if(i >= num) break;
cur->right = new TreeNode(i++);
q.push(cur->right);
}
}
TreeNode* inverTree(TreeNode* root){
if(!root) return root;
TreeNode* tmp = root->right;
root->right = root->left;
root->left = tmp;
return root;
}
void help(TreeNode* root, int num){
if(!root) return ;
if(root->val == num){
root = inverTree(root);
return ;
}
help(root->left, num);
help(root->right , num);
}
void levelOrder(TreeNode* root) {
if(!root) return;
queue<TreeNode*> qu;
qu.push(root);
int len = qu.size();
while(!qu.empty()){
vector<int> vec;
while(len--){
cout<< (qu.front()->val) << endl;
if(qu.front()->left){
qu.push(qu.front()->left);
}
if(qu.front()->right){
qu.push(qu.front()->right);
}
qu.pop();
}
len = qu.size();
}
}
int main()
{
int n, m;
cin>>n >> m;
int num = pow(2, n) - 1;
TreeNode* root;
createtree(root, num);
help(root, m);
levelOrder(root);
return 0;
}