二叉树基本操作(输出所有叶子节点到根节点的路径)

/*
功能:(1)输出二叉树的所有叶子节点
     (2)输出所有从叶子节点到根节点的路径
     (3)输出(2)中最长的一条路径
作者:pussy
日期:2015-11-28
*/
# include
# include

typedef struct BiNode{
    char data;
    struct BiNode *lchild,*rchild;
}BiNode,*BiTree;

void LongestPath(BiTree T,char path[],int &pathLength,char longestPath[],int &longestLength);
void createBiTree(BiTree &T);
void AllPath(BiTree T,char path[],int &pathLength);
void DisDeaf(BiTree T);

int main()
{
    BiTree T=NULL;
    printf("创建二叉树:");
    createBiTree(T);
    char path[100],longestPath[100];
    int pathLength=0,longestLength=0;
    printf("树中有以下的叶子节点:");
    DisDeaf(T);
    printf("\n");
    AllPath(T,path,pathLength);
    LongestPath(T,path,pathLength,longestPath,longestLength);
    printf("最长的路径是:");
    for(int i=longestLength;i>=0;i--)
    {
        printf("%c ",longestPath[i]);
    }
    printf("\n");
    return 0;
}

//创建二叉树
void createBiTree(BiTree &T)
{
    char ch=getchar();
    //输入字符'#'代表空
    if(ch=='#')
        T=NULL;
    else
    {
        T=(BiTree)malloc(sizeof(BiNode));
        T->data=ch;
        T->lchild=T->rchild=NULL;
        createBiTree(T->lchild);
        createBiTree(T->rchild);
    }
}

//输出所有叶子节点到根的路径
//当T是空节点,返回上一层,不做处理
//当T是叶子节点,先将T加入路径中,在输出路径
//当T不是叶子节点也不是空节点的时候,将该节点加入路径中
//path中存储从根节点到叶子节点的路径,pathLength是path的长度
void AllPath(BiTree T,char path[],int &pathLength)
{
    if(T!=NULL)
    {
        if(T->lchild==NULL&&T->rchild==NULL)
        {
            path[pathLength]=T->data;
            printf("%c叶子节点到根节点的路径为: ",T->data);
            for(int i=pathLength;i>=0;i--)
                printf("%c ",path[i]);
            printf("\n");
        }
        else
        {
            path[pathLength++]=T->data;
            AllPath(T->lchild,path,pathLength);
            AllPath(T->rchild,path,pathLength);
            pathLength--;
        }
    }
}

//输出最长路径,算法和输出所有路径相似
//不同的是,遇到叶子节点时,比较当前路径和是否比目前记录的最长路径
//还长,如果是,则更新最长路径。
void LongestPath(BiTree T,char path[],int &pathLength,char longestPath[],int &longestLength)
{
    if(T!=NULL)
    {
        if(T->lchild==NULL&&T->rchild==NULL)
        {
            path[pathLength]=T->data;
            if(pathLength>longestLength)
            {
                for(int i=pathLength;i>=0;i--)
                {
                    longestPath[i]=path[i];
                }
                longestLength=pathLength;
            }
        }
        else
        {
            path[pathLength++]=T->data;
            LongestPath(T->lchild,path,pathLength,longestPath,longestLength);
            LongestPath(T->rchild,path,pathLength,longestPath,longestLength);
            pathLength--;
        }
    }
}

void DisDeaf(BiTree T)
{
    if(T!=NULL)
    {
        if(T->lchild==NULL&&T->rchild==NULL)
            printf("%c ",T->data);
        DisDeaf(T->lchild);
        DisDeaf(T->rchild);
    }
}

二叉树基本操作(输出所有叶子节点到根节点的路径)_第1张图片

你可能感兴趣的:(数据结构)