| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 609 人关注过本帖
标题:二叉排序树算法 插入好像不成功~
只看楼主 加入收藏
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
结帖率:81.82%
收藏
已结贴  问题点数:5 回复次数:4 
二叉排序树算法 插入好像不成功~
输入格式

第一行:准备建树的结点个数n
第二行:输入n个整数,用空格分隔
第三行:输入待查找的关键字
第四行:输入待查找的关键字
第五行:输入待插入的关键字


输出格式

第一行:查找结果(找到输出1,找不到输出0)
第二行:查找结果(找到输出1,找不到输出0)
第三行~第八行:插入新结点后的二叉树的先、中、序遍历序列
第四行:插入新结点后的二叉树的中序遍历序列(非递归算法)
第五行:插入新结点后的二叉树的层次遍历序列





源代码:


#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK  1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int  Status;

typedef int  ElemType;
typedef struct BiTNode{
  ElemType data;
  struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;





Status insertNode(BiTree &T,int n)                            //插入函数
{
    if(!T)
    {
        if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;                        //一定要进行空间分配 动态分配空间
        T->data=n;
        T->lchild=NULL;
        T->rchild=NULL;
    }
    else
    {
        if(n<=T->data)
            insertNode(T->lchild,n);
        else
            insertNode(T->rchild,n);
    }
    return OK;
}
   



Status CreateBiTree(BiTree &T)                        //初始化二叉树
{
    T=NULL;

    int m,n;
    scanf("%d",&m);
    while(m--)
    {
        
        scanf("%d",&n);
        insertNode(T,n);
    }
    return OK;                        
   

  return OK;
} // CreateBiTree








Status PrintElement(ElemType e ) {  // 输出元素e的值
printf("%d ", e);
return OK;
}// PrintElement


Status PreOrderTraverse( BiTree T) {
   
   // 前序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
   //补全代码,可用多个语句
    if(T)
    {
        if(PrintElement(T->data))
            if(PreOrderTraverse(T->lchild))
                if(PreOrderTraverse(T->rchild))
                    return OK;
        return ERROR;
    }
    else
    return OK;

} // PreOrderTraverse



Status InOrderTraverse( BiTree T) {
     // 中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
    //补全代码,可用多个语句   
    if(T)
    {
    if(InOrderTraverse(T->lchild))
        if(PrintElement(T->data))        
                if(InOrderTraverse(T->rchild))
                    return OK;
        return ERROR;
    }
    else
    return OK;

   
  
} // InOrderTraverse

Status PostOrderTraverse( BiTree T) {
     // 后序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
    //补全代码,可用多个语句
    if(T)
    {
    if(PostOrderTraverse(T->lchild))            
        if(PostOrderTraverse(T->rchild))
            if(PrintElement(T->data))
                    return OK;
        return ERROR;
    }
    else
        return OK;
   
} // PostOrderTraverse


Status Search(BiTree T,int key,BiTree f,BiTree &p)                                //遍历树,查找是否存在元素
{


    if(!T){p=f;return FALSE;}                                                    //查找不成功,
    else if(key==T->data){p=T;return TRUE;}                                        //查找成功
    else if(key<T->data) return Search(T->lchild,key,T,p);                        //在左子树中继续查找
    else  return Search(T->rchild,key,T,p);                                        //在柚子树中继续查找
}

Status Insert(BiTree &T,int e)                                                    //插入关键字
{
    BiTree s;
    BiTree p;
    p=T;

   

    if(!Search(T,e,NULL,p))
    {
        
        s=(BiTNode *)malloc(sizeof(BiTNode));
        s->data=e;
        s->lchild=s->rchild=NULL;
        if(!p) T=s;                                                            //被插入结点s为新的根结点
        else if(e<p->data) p->lchild=s;                                        //插入的是左孩子
        else p->rchild=s;                                                    //插入的是柚孩子
        return TRUE;
    }
    else return FALSE;
}
int main()   //主函数
{
   BiTree T;
   CreateBiTree(T);
 /* PreOrderTraverse(T);
   putchar('\n');
   InOrderTraverse(T);
   putchar('\n');
   PostOrderTraverse(T);
   putchar('\n');*/
    int i,m;
    for(i=1;i<=2;i++)
    {
        scanf("%d",&m);
        printf("%d\n",Search(T,m,NULL,T));
    }
    int g;
    scanf("%d",&g);
    Insert(T,g);
    PreOrderTraverse(T);
   putchar('\n');
   InOrderTraverse(T);
   putchar('\n');
   PostOrderTraverse(T);
   putchar('\n');





   return OK;
   
 }//main
/*
7
40 20 60 18 50 56 90
18
35
30




输出样例

1
0
40 20 18 30 60 50 56 90
18 20 30 40 50 56 60 90
18 30 20 56 50 90 60 40
*/



应该是search和Insert函数挂了       先序,中序,后序 排序算法没问题  测试语句注释掉了~

[ 本帖最后由 凉粉呵呵 于 2013-5-4 00:16 编辑 ]
搜索更多相关主题的帖子: include 关键字 二叉树 
2013-05-04 00:15
Juson
Rank: 4
等 级:业余侠客
帖 子:70
专家分:235
注 册:2013-4-8
收藏
得分:3 
BiTree insertNode(BiTree T,int n)                            //把函数的返回类型改成BiTree, 把那个取地址符&去掉
{
    if(!T)                                                   // 这里T从空变成非空了,所以一定要把T作为返回值才能实现插入
    {
        if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;              
        T->data=n;
        T->lchild=NULL;
        T->rchild=NULL;
    }
    else
    {
        if(n<=T->data)
            T->lchild=insertNode(T->lchild,n);           //此处也要这样修改,
        else
           T->rchild= insertNode(T->rchild,n);
    }
    return T;                      //此处将T返回
}

[ 本帖最后由 Juson 于 2013-5-4 00:26 编辑 ]
2013-05-04 00:25
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
收藏
得分:0 
回复 2楼 Juson
好像不用啊  你将main函数中的注释测试一下   我那样写是可以实现插入的~
2013-05-04 21:51
Juson
Rank: 4
等 级:业余侠客
帖 子:70
专家分:235
注 册:2013-4-8
收藏
得分:0 
好吧,你这代码让人很无语,开头写着<stdio.h>,输入、输出用着printf、scanf,猛一看就是C代码,原来是C++,可既然是C++,你为啥不用<iostream>,以及cin、cout呢
其他不多说,就说你插入函数
Status Insert(BiTree &T,int e)                                                    //插入关键字
{
    BiTree s;
    BiTree p;
    p=T;
  

    if(!Search(T,e,NULL,p))
    {
      
        s=(BiTNode *)malloc(sizeof(BiTNode));
        s->data=e;
        s->lchild=s->rchild=NULL;
        if(!p) T=s;                                                         
        else if(e<p->data) p->lchild=s;                                        //这里你直接用S把原来的左孩子以及左孩子的后裔都覆盖掉了,所以左边的就只有S这一个节点了, 插入不可能这么省事的,要用递归或者循环插入的
        else p->rchild=s;                                                    //这里错误同上
        return TRUE;
    }
    else return FALSE;
}


另外循环完全不用那么多if语句, 以前序遍历为例
void PreOrderTraverse( BiTree T) {
  
   // 前序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
   //补全代码,可用多个语句
    if(T)
    {
       PrintElement(T->data) ;          //先打印父节点
       PreOrderTraverse(T->lchild) ;    // 递归打印左子树
       PreOrderTraverse(T->rchild) ;    // 递归打印右子树
    }
} // PreOrderTraverse


[ 本帖最后由 Juson 于 2013-5-5 00:36 编辑 ]
2013-05-05 00:34
y1207435881
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:225
专家分:762
注 册:2013-4-30
收藏
得分:3 
高深的问题,顶啊
2013-05-05 00:38
快速回复:二叉排序树算法 插入好像不成功~
数据加载中...
 
   



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

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