完全二叉树的建立和翻转

建立一个深度为n的完全二叉树,并翻转值为m的子树,输出最后层序输出二叉树的所有节点

节点的值从1开始递增

输入:

4  3

输出

1

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; }
原文地址:https://www.cnblogs.com/-citywall123/p/13419492.html