zjjahshjsj 0 673892
/88199
123568753219899
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Node {
int data;
struct Node *leftchild;
struct Node *rightchild;
}Node, *Tree;
Tree CreatTree() {
printf("CreatTree\n");
int k;
scanf_s("%d", &k);
if (k == 0) {
return NULL;
}
Node *t = new Node;
t->data = k;
t->leftchild = CreatTree();
t->rightchild = CreatTree();
return t;
}
int num = 1;
void printNode(Tree T, int level, int k) {
printf("printNode\n");
if (T == NULL || level < 0) {
return;
}
if (level == 0) {
if (num == k) {
printf("%d\n", T->data);
}
num++;
}
printNode(T->rightchild, level - 1, k);
printNode(T->leftchild, level - 1, k);
}
int main() {
int m, k;
scanf_s("%d %d", &m, &k);
printf("m=%d,k=%d\n", m, k);
Tree T = CreatTree();
printNode(T, m, k);
return 0;
}
解答如下
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<math.h>
//层序遍历二叉树
typedef struct TreeNode//树节点
{
struct TreeNode* left,* right;
int data;
}TreeNode, * pTreeNode;
typedef struct QueueNode//队列节点
{
pTreeNode data;
QueueNode* next;
}QueueNode, * pQueueNode;
typedef struct Queue//队列
{
pQueueNode front,rear;
}Queue, * pQueue;
void createTree(pTreeNode& t)//创建树,&引用已经定义的t
{
int ch;
scanf("%d",&ch);
if (ch == 0)//如果输入*则为空
{
t = NULL;
}
else
{
t = new TreeNode;
t->data = ch;
createTree(t->left);//递归
createTree(t->right);
}
}
pQueue initQ(pQueue pq)//建立只有头结点的队列
{
pq->front = (pQueueNode)malloc(sizeof(QueueNode));
if (pq->front==NULL)//判断内存分配是否成功
{
printf("内存分配不成功!");
}
else
{
pq->front->next = NULL;//队列的front和rear的next初始化为空
pq->rear = pq->front;
return pq;
}
}
void enqueue(pQueue pq, pTreeNode t)//把二叉树的数据取出放入队列
{
pQueueNode pNew = new QueueNode;
pNew->data = t;//二叉树的数据存入队列
pNew->next = NULL;
pq->rear->next = pNew;//尾插法建立连接
pq->rear = pNew;//rear更新
}
pTreeNode dequeue(pQueue pq)//出队:删除队列第一个元素
{
pQueueNode pTemp= (pQueueNode)malloc(sizeof(QueueNode));
pTemp = pq->front->next;
if (pTemp->next == NULL)//只剩下1个节点(不含队列空的头结点)
{
pq->rear = pq->front;
}
else{
pq->front->next = pTemp->next;//front+1(从指向第1个非空节点改为指向第2个节点)
}
pTreeNode x;
x= pTemp->data;//x为队列第一个元素的data
free(pTemp);
return x;
}
int cal(int n)
{
if(n<0) return 0;
int sum=0;
for(int i=0;i<=n;i++)
{
sum+=(int)pow(2,i);
}
return sum;
}
int cal_index(int m,int k)
{
if(m<0) return 0;
return cal(m)-k+1;
}
void LevelOrderBiTree(pTreeNode t,int m,int k)//层序输出
{
int le=0,num=0;
pQueue pq= (pQueue)malloc(sizeof(Queue));
pq = initQ(pq);
enqueue(pq,t);//取出二叉树的根节点,子节点存入队列
while (pq->rear != pq->front)//当队列不为空
{
pTreeNode x = dequeue(pq);//x用于输出队列弹出元素的数据
if((int)(pow(2,le)-1)==num) le++;
num++;
int index=cal_index(m,k);
if(le-1==m&&index==num)
printf("%d\n", x->data);
if (x->left!=NULL)
{
enqueue(pq, x->left);//递归左节点
}
if (x->right!=NULL)
{
enqueue(pq, x->right);//递归右节点
}
}
}
int main()
{
pTreeNode t;
int m=0,k;
while(m!=-1)
{
scanf("%d%d",&m,&k);
if(m==-1) break;
createTree(t);
LevelOrderBiTree(t,m,k);
}
return 0;
}
#include<stdio.h>
int tree[2022];
void createTree(int now);
int main(){
int m,k;
scanf("%d %d",&m,&k);
createTree(1);
int head = 2 << (m-1),tail = (2 << m)-1; // 该层在数组中的头尾位置
// printf("%d %d\n",head,tail); // 解开注释查看范围
for(int z=tail;z>=head;z--){
if(tree[tail]==0) continue; // 这里不太确定0算不算,就假设不算节点了
if(k==1) {
printf("%d",tree[z]);
break;
}
k--;
if(z==head) puts("0");
}
return 0;
}
void createTree(int now)
{
scanf("%d",&tree[now]);
if(tree[now]==0) return;
createTree(now*2);
createTree(now*2+1);
}
#include<iostream>
#include<queue>
using namespace std;
typedef struct Node{
struct Node *l,*r;
int data;
}*tree,node;
int x;
void create(tree &T)
{
int c;
cin>>c;
if(c==0)
{
T=NULL;
}else
{
T=new node;
T->data=c;
create(T->l);
create(T->r);
}
}
int ac=0;
void seek(tree T)
{
if(T)
{
queue<pair<tree,int> > Q;
Q.push(make_pair(T,0));
while(!Q.empty())
{
pair<tree,int> s=Q.front();
tree e=s.first;
int z=s.second;
if(z==x)
{
ac=e->data;
}else if(z>x)
{
return ;
}
Q.pop();
if(e->l){
Q.push(make_pair(e->l,z+1));}
if(e->r){
Q.push(make_pair(e->r,z+1));}
}
}
}
int main()
{
tree T;
create(T);
cin>>x;
seek(T);
printf("%d",ac);
}