标题:求大神帮看下 顺便帮忙改下
只看楼主
ljsj123
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-6-24
 问题点数:0 回复次数:1 
求大神帮看下 顺便帮忙改下
在二叉树中找到和为某一值的所有路径,先通过两个遍历序列生成二叉链表 在通过遍历输出路权值于输入的整数想等的路径

#include <stdlib.h>  
#include<stdio.h>  
#include <string.h>  
  
#define  N  100  
  
typedef struct BiTNode   
{   
    char data;   
    struct BiTNode *lchild,*rchild;   
} BiTNode,* BITree;   
  
//先序遍历   
void preOrder(BiTNode*root)   
{   
    if (root==NULL)   
    {   
        return;   
    }   
    printf("%c ",root->data);   
    preOrder(root->lchild);   
    preOrder(root->rchild);   
}   
//中序遍历   
void inOrder(BiTNode*root)   
{   
    if (root==NULL)   
    {   
        return;   
    }   
    inOrder(root->lchild);   
    printf("%c ",root->data);   
    inOrder(root->rchild);   
}   
  
//根据先序遍历和中序遍历创建二叉树  
BiTNode* createBiTree(char *pre, char *in, int n)  
{  
    int i = 0;  
    int n1 = 0,n2 = 0;  
    int m1 = 0,m2 = 0;  
    BiTNode*node = NULL;  
    char lpre[N],rpre[N];  
    char lin[N],rin[N];  
    if (n == 0)  
    {  
        return NULL;  
    }  
    node = (BiTNode*)malloc(sizeof(BiTNode));   
    if (node==NULL)   
    {   
        return NULL;   
    }   
    memset(node,0,sizeof(BiTNode));   
    //先序序列的第一个元素必为根结点  
    node->data = pre[0];  
    //根据根结点将中序序列分为左子树和右子数  
    for (i = 0;i<n;i++)  
    {  
        if ((i<=n1)&&(in[i]!=pre[0]))  
        {  
            lin[n1++] = in[i];  
        }  
        else if(in[i]!=pre[0])  
        {  
            rin[n2++] = in[i];  
        }  
    }  
    //根据树的先序序列的长度等于中序序列的长度  
    //且先序遍历是先左子树再后子树,无论先序还是中序 左子树和右子树的长度都是固定的  
    // 从i=1开始 因为先序遍历的第一个是根   
    for (i = 1;i < n;i++)  
    {  
        if (i< (n1+1))//n1代表了左子树的长度  
        {  
            lpre[m1++] = pre[i];  
        }  
        else  
        {  
            rpre[m2++] = pre[i];  
        }  
    }  
    node->lchild = createBiTree(lpre,lin,n1);  
    node->rchild = createBiTree(rpre,rin,n2);  
  
    return node;  
}  
void Search(BiTNode *Root, int sum, int path[],int count)  
{  
    path[count++] = Root->data;  //从根开始记录路径和点之和  
    sum -= Root->data;  
    if(Root->lchild==NULL && Root->rchild==NULL)  
    {  
        if(sum == 0)  
        {  
            int i=0;  
            for(i=0;i<count;i++)  
              printf("path[i]\n");  
        }  
        return;  
    }  
    else  
    {  
        Search(Root->lchild, sum, path, count);  
        Search(Root->rchild, sum, path, count);  
    }  
    count--;                       //回溯!!!!!!!!!  
    sum += Root->data;  
}  
  
int main()  
{  
    char preNode[N];  
    char inNode[N];  
    int n = 0;  
    char ch;  
    BiTNode* root=NULL;  
    printf("请输入先序序列\n");  
    while((ch = getchar())&&ch!='\n')  
        preNode[n++] = ch;  
    printf("请输入中序序列\n");  
    n = 0;  
    while((ch = getchar())&&ch!='\n')  
        inNode[n++] = ch;  
    root = createBiTree(preNode,inNode,n);  
  
    printf("先序序列\n");  
    preOrder(root);  
    printf("\n中序序列\n");  
    inOrder(root);  
    int path[10];  
    int sum;
    scanf("%d\n",&sum) ;
    int count=0;  
    Search(root, sum, path, count);  
    return 0;  
}  
搜索更多相关主题的帖子: 序列 先序 NULL int sum 
2018-06-24 19:53
ljsj123
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-6-24
得分:0 
只能实现前序和后序生成一课二叉树 后面的实现不了
2018-06-24 19:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-488122-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.305485 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved