C语言/C++程序问题,怎么改

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;
}

解答如下

img

img

#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);
}