建立一个深度为n的完全二叉树,并翻转值为m的子树,输出最后层序输出二叉树的所有节点
节点的值从1开始递增
输入:
4 3
输出
1
2
3
4
5
7
6
8
9
10
11
14
15
12
13
#include<iostream> #include<queue> #include<math.h> #include<algorithm> using namespace std; int a[100005]; typedef struct node{ int val; node* left; node* right; }Treenode; Treenode* creat(int n,int m) {
//先创建一棵空树 Treenode* root=(Treenode*)malloc(sizeof(Treenode)*(n+1)); for(int i=1;i<=n;i++){ root[i].val=a[i]; root[i].left=NULL; root[i].right=NULL; }
//给树赋值 for(int i=1;i<=n/2;i++){ if(i*2<=n) root[i].left=&root[2*i]; if(i*2+1<=n) root[i].right=&root[2*i+1]; }
//翻转子树 for(int i=1;i<=n/2;i++){ if(root[i].val==m){ if(i*2<=n) root[i].left=&root[2*i+1]; if(i*2+1<=n) root[i].right=&root[2*i]; break; } } return &root[1]; }
//层序输出 void Print(node* &root) { queue<node*>q; q.push(root); while(!q.empty()){ printf("%d ",q.front()->val); if(q.front()->left) q.push(q.front()->left); if(q.front()->right) q.push(q.front()->right); q.pop(); } printf(" "); } int main() { int n,k,x,t=1; cin>>n>>k; for(int i=1;i<=n;i++){ for(int j=0;j<pow(2,i-1);j++) { a[t]=t; t++; } } Treenode* root=NULL; root=creat(t-1,k); Print(root); return 0; }