关于#c语言#的问题:#include <stdio.h>

为什么这个代码运行不了啊?有没有人能帮我解答一下,题目是二叉搜索树的最近公共祖先。

#include<stdio.h>
#include<stdlib.h>
#define MAX 50

/*-----------二叉树定义------------*/
typedef int elementtype;
typedef struct Tnode *position;
typedef position Bintree;
struct Tnode{
    elementtype Data;
    Bintree Left;//左子树
    Bintree Right;//右子树 
}; 
/*----------------------------------*/

elementtype Chongpai(int Inorder[],int N)
{
    int i,t;
    for(i=0;i<N;i++)
    {
        if(Inorder[i+1]<Inorder[i])
        {
            t=Inorder[i];Inorder[i]=Inorder[i+1];Inorder[i+1]=t;
        }
    }
    return Inorder;
}

Bintree Buildtree(int Qianxu[],int Inorder[],int N)
{
    Bintree T;
    int p;
    if(!N)return NULL;//递归终止条件
    else{
        T=(Bintree)malloc(sizeof(struct Tnode));
    T->Data =Qianxu[0];//根结点是前序第一个 
    T->Left =T->Right =NULL;
    for(p=0;p<N;p++)//从中序中找根结点 
    {
        if(Inorder[p]==Qianxu[0])break;
     }
     T->Left=Buildtree(Qianxu+1,Inorder,p);
     T->Right =Buildtree(Qianxu+p,Inorder+p+1,N-p-1);
    }
    return T;
}

position Find(Bintree T,elementtype x)
{
    if(!T)return NULL;
    while(T)
    {
        if(x>T->Data )
        T=T->Right ;//向右子树中移动,继续查找
        else if(x<T->Data)
        T=T->Left ;//向左子树移动,继续查找
        else break; 
    }
    return T;
}

void Searchancestor(int U[],int V[],int N,Bintree T)
{
    int k,j,m;
    for(k=0;k<N;k++)
    {
     if(Find(T,U[k])&&Find(T,V[k]))
      {
        m=T->Data ;
        if(U[k]==T->Left->Data&&V[k]==T->Right->Data||U[k]==T->Right->Data&&V[k]==T->Left->Data)
        printf("LAC of %d and %d is %d.\n",U[k],V[k],m);
        else if(U[k]==m)
        {
            if(V[k]==T->Left->Data ||V[k]==T->Right->Data)
            printf("%d is an ancestor of %d.\n",U[k],V[k]);
        }
            else if(V[k]==m)
            {
                if(U[k]==T->Left->Data ||U[k]==T->Right->Data)
                printf("%d is an ancestor of %d.\n",V[k],U[k]);
            }
      }
      if(!Find(T,U[k]))
          printf("ERROR:%d is not found.\n",U[k]);
      if(!Find(T,V[k]))
          printf("ERROR:%d is not found.\n",V[k]);
      if(!Find(T,U[k])&&!Find(T,V[k]))
        printf("ERROR:%d and %d are not found.\n",U[k],V[k]);
    }
}

int main()
{
    Bintree T;
    int Qianxu[MAX],Inorder[MAX],i;
    int M,N,U[MAX],V[MAX];
    printf("请输入待查询的结点对数和二叉搜索树中结点个数:\n");
    scanf("%d %d",&M,&N);
    printf("请输入先序遍历结果:\n");
    for(i=0;i<N;i++)
    {
        scanf("%d",&Qianxu[i]);
    }
    for(i=0;i<N;i++)
{
    Inorder[i]=Qianxu[i];
}
    Chongpai(Inorder,N);
    T=Buildtree(Qianxu,Inorder,N);
    printf("请输入待查询的结点:\n");
    for(i=0;i<M;i++)
      {
          scanf("%d %d",&U[i],&V[i]);
    }
    Searchancestor(U,V,N,T);
    return 0;
}

仅供参考:

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct BiTNode {//二叉树结点
    char data;                      //数据
    struct BiTNode *lchild,*rchild; //左右孩子指针
} BiTNode,*BiTree;
int nn=0;
int CreateBiTree(BiTree *T) {//按先序序列创建二叉树
    char data;
    scanf("%c",&data);//按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树
    if (data == '#') {
        *T = NULL;
    } else {
        *T = (BiTree)malloc(sizeof(BiTNode)); nn++;
        (*T)->data = data;         //生成根结点
        CreateBiTree(&(*T)->lchild);//构造左子树
        CreateBiTree(&(*T)->rchild);//构造右子树
    }
    return 0;
}
void Visit(BiTree T) {//输出
    if (T->data != '#') {
        printf("%c ",T->data);
    }
}
void PreOrder(BiTree T) {//先序遍历
    if (T != NULL) {
        Visit(T);               //访问根节点
        PreOrder(T->lchild);    //访问左子结点
        PreOrder(T->rchild);    //访问右子结点
    }
}
void InOrder(BiTree T) {//中序遍历
    if (T != NULL) {
        InOrder(T->lchild);     //访问左子结点
        Visit(T);               //访问根节点
        InOrder(T->rchild);     //访问右子结点
    }
}
void PostOrder(BiTree T) {//后序遍历
    if (T != NULL) {
        PostOrder(T->lchild);   //访问左子结点
        PostOrder(T->rchild);   //访问右子结点
        Visit(T);               //访问根节点
    }
}
void PreOrder2(BiTree T) {//先序遍历(非递归)
//访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。
    BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));
    int sp=0;
    BiTree p = T;//p是遍历指针
    while (p || sp) {   //栈不空或者p不空时循环
        if (p != NULL) {
            stack[sp]=p;sp++;       //存入栈中
            printf("%c ",p->data);  //访问根节点
            p = p->lchild;          //遍历左子树
        } else {
            sp--;p=stack[sp];       //退栈
            p = p->rchild;          //访问右子树
        }
    }
    free(stack);
}
void InOrder2(BiTree T) {//中序遍历(非递归)
//T是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。
//先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T->data,再中序遍历T的右子树。
    BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));
    int sp=0;
    BiTree p = T;//p是遍历指针
    while (p || sp) {   //栈不空或者p不空时循环
        if (p != NULL) {
            stack[sp]=p;sp++;       //存入栈中
            p = p->lchild;          //遍历左子树
        } else {
            sp--;p=stack[sp];       //退栈
            printf("%c ",p->data);
            p = p->rchild;          //访问右子树
        }
    }
    free(stack);
}

typedef struct BiTNodePost{
    BiTree biTree;
    char tag;
} BiTNodePost,*BiTreePost;
void PostOrder2(BiTree T) {//后序遍历(非递归)
    BiTreePost *stack=(BiTreePost *)malloc(nn*sizeof(BiTreePost));
    int sp=0;
    BiTree p = T;//p是遍历指针
    BiTreePost BT;
    while (p != NULL || sp) {//栈不空或者p不空时循环
        while (p != NULL) {//遍历左子树
            BT = (BiTreePost)malloc(sizeof(BiTNodePost));
            BT->biTree = p;
            BT->tag = 'L';//访问过左子树
            stack[sp]=BT;sp++;       //存入栈中
            p = p->lchild;
        }
        while (sp && (stack[sp-1])->tag == 'R') {//左右子树访问完毕访问根节点
            sp--;BT=stack[sp];        //退栈
            printf("%c ",BT->biTree->data);
            free(BT);
        }
        if (sp) {//遍历右子树
            BT=stack[sp-1];
            BT->tag = 'R';//访问过右子树
            p = BT->biTree;
            p = p->rchild;
        }
    }
    free(stack);
}
void LevelOrder(BiTree T) {//层次遍历
    BiTree p;
    BiTree *queue;
    int h=0,t=0,n=0;

    if (T == NULL) return;
    p=T;
    queue=(BiTree *)malloc(nn*sizeof(BiTree));
    queue[t]=p;t=(t+1)%10;n++;//根节点入队
    while (n) {    //队列不空循环
        p=queue[h];             //对头元素出队
        printf("%c ",p->data);  //访问p指向的结点
        h=(h+1)%10;n--;         //退出队列
        if (p->lchild != NULL) {//左子树不空,将左子树入队
            queue[t]=p->lchild;t=(t+1)%10;n++;
        }
        if (p->rchild != NULL) {//右子树不空,将右子树入队
            queue[t]=p->rchild;t=(t+1)%10;n++;
        }
    }
    free(queue);
}
int main() {
    BiTree T;

    setlocale(LC_ALL,"chs");
    CreateBiTree(&T);

    printf("先序遍历        :");PreOrder  (T);printf("\n");
    printf("先序遍历(非递归):");PreOrder2 (T);printf("\n");
                                               printf("\n");
    printf("中序遍历        :");InOrder   (T);printf("\n");
    printf("中序遍历(非递归):");InOrder2  (T);printf("\n");
                                               printf("\n");
    printf("后序遍历        :");PostOrder (T);printf("\n");
    printf("后序遍历(非递归):");PostOrder2(T);printf("\n");
                                               printf("\n");
    printf("层次遍历        :");LevelOrder(T);printf("\n");

    return 0;
}
//ABC##DE#G##F###
//先序遍历        :A B C D E G F
//先序遍历(非递归):A B C D E G F
//
//中序遍历        :C B E G D F A
//中序遍历(非递归):C B E G D F A
//
//后序遍历        :C G E F D B A
//后序遍历(非递归):C G E F D B A
//
//层次遍历        :A B C D E F G
//

///       A
///      /
///     B
///    / \
///   C   D
///      / \
///     E   F
///      \
///       G


  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/231860
  • 这篇博客也不错, 你可以看下C语言中 stdio.h 源码
  • 除此之外, 这篇博客: C语言#include<stdio.h>什么意思?中的 二、stdio.h是什么 ? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • stdio.h是标准输出/输出头文件。英文全程为standard input/out.head。可以简单理解为在这个文件中包含了一些输入和输出的函数。换句话说,要用到printf()和scanf()这两个打印和输入函数,就必须要有这个文件。