#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define FALSE 0
//定义结构体
typedef struct BiTNode
{
    //int data;
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//创建二叉树
int CreateBiTree(BiTree &T)
{
    printf("\n==========Create BiTree!===========\n");
    char ch;
//
    ch=getchar();
    printf("Input the Node/# is stand for none:\n");
    scanf("%c",&ch);
    if(ch=='#')T=NULL;
    else
    {
        if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
        {
            exit(1);
        }
        T->data=ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
    return OK; 
}
//访问函数
int Visit(char e)
{
    printf("%c",e);
    return OK;
}
//先序遍历
int PreOrderTraverse(BiTree T)
{
    if(T)
    {
        if(Visit(T->data))
        {
            if(PreOrderTraverse(T->lchild))
            {
                if(PreOrderTraverse(T->rchild))
                {
                    return OK;
                }
            }
            return FALSE;
        }
        return FALSE;
    }
    else
    {
        return OK;
    }
}
//中序遍历
int InOrderTraverse(BiTree T)
{
    if(T)
    {
        if(InOrderTraverse(T->lchild))
        {
            if(Visit(T->data))
            {
                if(InOrderTraverse(T->rchild))
                {
                    return OK;
                }
            }
            return FALSE;
        }
        return FALSE;
    }
    else
    {
        return OK;
    }
}
//后序遍历
int PostOrderTraverse(BiTree T)
{
    if(T)
    {
        if(PostOrderTraverse(T->lchild))
        {
            if(PostOrderTraverse(T->rchild))
            {
                if(Visit(T->data))
                {
                    return OK;
                }
            }
            return FALSE;
        }
        return FALSE;
    }
    else
    {
        return OK;
    }
}
//求树的高度
int getTreeHight(BiTree T)
{
    int lhight=0,
        rhight=0,
        hight=0;
    if(!T)
       return 0;
    else
    {
        lhight=getTreeHight(T->lchild);
        rhight=getTreeHight(T->rchild);
        hight=((lhight>rhight)?lhight:rhight) + 1;
       // hight=(lhight>rhight)?lhight:rhight + 1;
      //
  printf("%d",hight);
        return hight; 
    }
     
}
//求树的节点数 
int getTreeNodeNumber(BiTree T)
{
    int lnum=0,
        rnum=0,
        num=0;
    if(!T)
       return 0;
    else
    {
       lnum=getTreeNodeNumber(T->lchild);
       rnum=getTreeNodeNumber(T->rchild);
       num=lnum+rnum+1;
     //
  printf("%d",num);
       return num;
  
    }
    
}
//求叶子节点数
int getTreeLeaveNumber(BiTree T) 
{
    int lnum=0,
        rnum=0,
        num=0;
    if(!T)
       return 0;
    else if((!T->lchild)&&(!T->rchild))
       return 1;
    else
    {
       lnum=getTreeLeaveNumber(T->lchild);
       rnum=getTreeLeaveNumber(T->rchild);
       num=lnum+rnum;
     //
  printf("%d",num);
       return num;
    }
}
//判断是否存在子孙关系
bool Locate(BiTree T,BiTree &R,char v)
{
    if(!T)
        return false;
    else if(T->data==v)
    {
        R=T;
        return true;
    }
    else
    {
        Locate(T->lchild,R,v);
        Locate(T->rchild,R,v);
    }
}
bool isInherit(BiTree T,BiTree R,char m,char n)
{
    //BiTree R;
    BiTree M;
    if(!Locate(T,R,m))
    {
        printf(" not Inerit!");
        return false;
    }
    else
    {
        if(!Locate(R,M,n))
        {
            printf(" not Inerit!");
            return false;
        }
        else
        {
            printf("Inerit!");
            return true;
        }
    }
}
int main()
{
    BiTree T;
    CreateBiTree(T);
    BiTree R;
    R=(BiTree )malloc(sizeof(BiTNode));
    printf("\n==========PreOrderTraverse============\n");
    PreOrderTraverse(T);
    printf("\n==========InOrderTraverse=============\n");
    InOrderTraverse(T);
    printf("\n==========PostOrderTraverse===========\n");
    PostOrderTraverse(T);
    printf("\n==========TreeHight===================\n");
    printf("%d",getTreeHight(T));
    printf("\n==========TreeNodeNumber==============\n");
    printf("%d",getTreeNodeNumber(T));
    printf("\n==========TreeLeaveNumber=============\n");
    printf("%d",getTreeLeaveNumber(T));
    printf("\n==========inherit==================\n");
    //==========
/*
    char v=0;
    printf("input v:\n");
    scanf("%s",&v);
    Locate(T,R,v);*/
    //==========
    char m=0,
         n=0;
    printf("input m:\n");
    scanf("%s",&m);
    printf("input n:\n");
    scanf("%s",&n);
    bool result=isInherit(T,R,m,n);
//
    printf("%d",result);
    system("pause");
    return 0;
}
//测试用例:abd###cmn####