网易雷火笔试 二叉树翻转

本题需要让你实现一个完全二叉树的翻转子树的操作。
给定一个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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱桃木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值