【无标题】

#include<bits/stdc++.h>
using namespace std;
#define TRUE        1
#define FALSE       0
#define ERROR       0
#define OVERFLOW    -1
#define OK          1
typedef int Status;
typedef int TElemType;
Status CreateBiTree(BiTree &T);
int GetDepthOfBiTree(BiTree T);
int LeafCount(BiTree T);
typedef struct BiTNode{
    TElemType data;
    struct BiTNode *lchild, *rchild;
}BiTNode, * BiTree;


Status CreateBiTree(BiTree &T){
    TElemType e;
    scanf("%d",&e);
    if(e==0){
        T=NULL;
    }
    else{
        T=(BiTNode*)malloc(sizeof(BiTNode));
        if(T==NULL)exit(OVERFLOW);
        T->data=e;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}
int GetDepthOfBiTree(BiTree T){
    if(T==NULL){
        return 0;
    }
    int ldepth=0,rdepth=0;
    else {
        ldepth=1+GetDepthOfBiTree(T->lchild);
        rdepth=1+GetDepthOfBiTree(T->rchild);
    }
    if(ldepth>rdepth){
        return ldepth;
    }
    else{
        return rdepth;
    }
}//getdepth



int main(){
    BiTree T;
    int depth,numberOfleaves;
    CreateBiTree(T);
    depth= GetDepthOfBiTree(T);
    numberOfLeaves=LeafCount(T);
    printf("%d %d\n",depth,numberOfLeaves);
    return 0;
}


**

**# ///**二叉树求深度******
int GetDepthOfBiTree ( BiTree T){
    int d1=0, d2=0, d; 
    if(!T)
        return 0;
    else{
        d1=GetDepthOfBiTree(T->lchild)+1;
        d2=GetDepthOfBiTree(T->rchild)+1;
    }
     if(d1>d2)
            d=d1;
        else
            d=d2;
    return d;
}

///后序输出第i个结点
void PrintNode(BiTree T){
    if(!T){
        return 0;
    }
    PrintNode(T->lchild);
    PrintNode(T->rchild);
    n--;
    if(!n){
        printf("%c",T->data);
    }    
}


///统计二叉树中指定元素节点的个数
int XNodeCountOfBiTree( BiTree T, TElemType x ){
    int cnt=0;
    if(T==NULL){
        cnt = 0;
    }
    else{
        if(T->data==x){
            cnt=1+XNodeCountOfBiTree(T->lchild, x)+XNodeCountOfBiTree(T->rchild, x);
        }
        else{
            cnt=XNodeCountOfBiTree(T->lchild, x)+XNodeCountOfBiTree(T->rchild, x);
        }
    }
    return cnt;
}


///二叉树求结点数
int NodeCountOfBiTree(BiTree T){
    if(T==NULL){
        return 0;
    }
    else{
        return 1+NodeCountOfBiTree(T->lchild)+NodeCountOfBiTree(T->rchild);
    }
}
///二叉树求叶子数
int LeafCount(BiTree T){
    int cnt=0;
    if(T==NULL){
        return 0;
    }
    else{
        if( T->lchild==NULL && T->rchild==NULL ){
            cnt++;
        }
        else{
            cnt=LeafCount(T->lchild)+LeafCount(T->rchild);
        }
    }
    return cnt;
}

```cpp


typedef int  Status;
typedef int  ElemType; //假设线性表中的元素均为整型

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

Status ListCreate_L(LinkList &L,int n)
{
    LNode *rearPtr,*curPtr;   //一个尾指针,一个指向新节点的指针
    L=(LNode*)malloc(sizeof (LNode));
    if(!L)exit(OVERFLOW);
    L->next=NULL;               //先建立一个带头结点的单链表
    rearPtr=L;  //初始时头结点为尾节点,rearPtr指向尾巴节点
    for (int i=1;i<=n;i++){  //每次循环都开辟一个新节点,并把新节点拼到尾节点后
        curPtr=(LNode*)malloc(sizeof(LNode));//生成新结点
        if(!curPtr)exit(OVERFLOW);
        scanf("%d",&curPtr->data);//输入元素值
        curPtr->next=NULL;  //最后一个节点的next赋空
        rearPtr->next=curPtr;
        rearPtr=curPtr;
    }
    return OK;
}
//下面是需要实现的函数的声明
int ListLocate_L(LinkList L, ElemType x);

int main()
{
    LinkList L;
    int n;
    int x,k;   
    scanf("%d",&n);  //输入链表中元素个数
    if(ListCreate_L(L,n)!= OK) {
          printf("表创建失败!!!\n");
          return -1;
    }
   scanf("%d",&x); //输入待查找元素
   k=ListLocate_L(L,x);
   printf("%d\n",k);
   return 0;
}

/* 请在这里填写答案 */


///单链表元素定位
int ListLocate_L( LinkList L, ElemType x ){
    LNode *p=L;//创建一个指向头结点的指针
    int cnt=1;
    while( p->next!=NULL ){
        p=p->next;//只要p的下一个结点不为空,就可以更新p
        if( p->data==x ){return cnt;}
        else{cnt++;}
    
    }
    return 0;
}

///删除单链表中最后一个与给定值相等的结点
void ListLocateAndDel_L(LinkList L, ElemType x){
    //思路:先定位,用指针px记录最新出现的与x相等的结点的上一个结点,如果后面还有x便继续更新px
    //注意:表空??
    LNode *p=L;//创建一个指向头结点的指针
    LNode *prior=L;//设置p的前驱指针
    LNode *px=L;//设置x结点的前驱节点
    while( p->next ){///遍历表中元素,只要表不空就前进,即当前结点的next不空就前进
        if(p->next->data==x){///若找到x,则把当前x结点的前驱节点px更新,
            px=p;/就是把x所在结点的下一个结点直接连接到x的上一个结点上
        }
        p=p->next;
    }
    if(px!=L){//只要最终px更新过,即并非没有更新,并非表中没有x
        px->next=px->next->next;
    }
}


///带头结点的单链表就地逆置
void ListReverse_L( LinkList &L ){
    LNode *p=L->next, *postP;  ///设置指针指向新结点
    L->next=NULL;
    while(p){
        postP=p;
        p=p->next;
        postP->next=L->next;
        L->next=postP;
    }
}


///两个有序链表序列的合并
/*
//思路:设计创建链表的函数creatList_L,生成两个链表后,
    //注意:S1或S2为空,?
    //      元素相同

Status creatList_L( LinkList &L ){      //创建链表
    LNode *rearPtr, *curPtr;            //定义一个尾指针,一个指向当前新结点的指针
    L=(LNode*)malloc(sizeof(LNode));    //开辟空间
    if(!L)  {exit(OVERFLOW);}           //检测是否开辟成功

    //对开辟好的链表的初始化
    L->next=NULL;   //把头结点L赋空
    rearPtr=L;      //初始时头结点就是尾结点,rearPtr指向尾结点
    int x;       //输入的data
    //scanf("%d",&x);
    while( scanf("%d",&x)!=EOF && x!=-1 ){          ///每次循环都会开辟一个新结点,并把它拼到尾结点之后
        curPtr=(LNode*)malloc(sizeof(LNode));       //每输入一个data便新开辟一个新结点
        if(!L)  {exit(OVERFLOW);}      //检测开辟了么?
        curPtr->data=x;                //当前输入的值赋给新开辟的结点的数值域
        curPtr->next=NULL;             //把新结点后面的赋空,方便其作为尾结点时能确保尾结点指针为空
        rearPtr->next=curPtr;          //把新结点连接到之前的尾结点后面
        rearPtr=curPtr;                //更新尾结点,把当前结点作为尾结点
    }
    return OK;
}
//设计把两个链表归并的函数
void mergeList_L( LinkList &La, LinkList &Lb, LinkList &Lc ){///实现两个链表融合成表L_mer
    //设置指针pa,pb,pc遍历三个表,比较当前最小元素,小的插入表Lc中pc后的位置
    LNode *pa=La->next;
    LNode *pb=Lb->next;     //让pa,pb分别指向各自头结点的后一个结点
    LNode *pc=Lc=La;        //让pc指向La的头结点,即把La的头结点作为Lc的头结点,
                            //La和Lc共用La的头结点
    while( pa&&pb ){
        if( pa->data < pb->data ){
            pc->next=pa;
            pc=pa;
            pa=pa->next;
        }
        else{
            pc->next=pb;
            pc=pb;
            pb=pb->next;
        }
    }
    if(pa)  pc->next=pa;
    if(pb)  pc->next=pb;
    free(Lb);//释放Lb
}

void printList_L(LinkList L){//输出链表的一个函数
    LNode *p=L->next;
    if(!p){
        printf("NULL");
        return;
    }
    while(p){
        if(p->next)     printf("%d ",p->data);
        else    printf("%d",p->data);
        p=p->next;
    }
}

int main(){
    LinkList s1, s2;
    LinkList L;
    creatList_L(s1);
    creatList_L(s2);
    mergeList_L(s1,s2,L);
    printList_L(L);

    return 0;
}
*/








上一篇:C++ new关键字之:int* i1=new int; 与int* i2=new int();的区别


下一篇:Java生成RSA公钥、私钥 与 GO、PHP互相加密解密