免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1081 | 回复: 2
打印 上一主题 下一主题

请各位帮忙看一下这条简单的程序(紧急) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-27 23:06 |只看该作者 |倒序浏览
/*2、假设二叉树采用链表形式存储,编写对二叉树进行前序遍历的非递归算法。*/
//当程序运行到free(p)时就会出错请大家帮忙看一下!!!
#include<iostream.h>;
#include<stdlib.h>;
#include<stdio.h>;

struct tree  //树的结构体类型
{
        tree * left;
        int data;
        tree * right;
};
typedef tree treenode;
typedef treenode * b_tree;

struct list  //链表的结构体类型
{
        b_tree address;
        list * next;
};
typedef list node;
typedef node * link;

//创建二叉树
b_tree create_btree(b_tree root,b_tree node)
{
        b_tree p=root;  //当前树的指针p
        if(root==NULL)  //当树为空时,把根指向新节点
        {
                root=node;  //根指针指向新节点
        }
        else
        {
                while(1)
                {
                        if(node->;data < p->;data)  //如果新节点的数据值比p所指向的节点的数据值小,                  
                        {                         //p指针就指向p的左孩子
                                if(p->;left==NULL)          //若p的左孩子为空就把p->;left指向新节点
                                {
                                        p->;left=node;
                                        break;
                                }
                                else                //否则p指向p->;left
                                {
                                        p=p->;left;
                                }
                        }
                        else                        //如果新节点的数据值比p所指向的节点的数据值大,p指针就指向p的左孩子
                        {
                                if(p->;right==NULL) //若p的左孩子为空就把p->;right指向新节点
                                {
                                        p->;right=node;
                                        break;
                                }
                                else                //否则p指向p->;right
                                {
                                        p=p->;right;
                                }
                        }
                }
        }
        return root;                //返回root的值
}

//把右子节点入栈
link push_stack(link stack,b_tree node)
{
        link newnode;        //链表类型的新节点指针
        newnode=(link)malloc(sizeof(node));
        if(newnode==NULL)        //判断内存是否分配失败
        {
                printf("\nMemory allocation failure!!!";
                return NULL;
        }
        else
        {
                        newnode->;address=node;        //将node的值付给newnode的address域       
                        newnode->;next=stack;        //newnode->;next指向原栈顶
                        stack=newnode;                //栈顶指向newnode
                        return stack;
        }
}

//出栈
link pop_stack(link stack,b_tree *node)        //出栈函数要求传入栈顶指针stack和b_tree类型指针node
{
        link p;
        if(stack!=NULL)                //栈不为空
        {
                p=stack;
                stack=stack->;next;        //栈顶指针stack指向下一结点
                *node=p->;address;        //把当前指针p的address域得数据赋给node所指的空间
               
        //        free(p);        //释放当前指针p(但当释放p时就会出错)
                return stack;
        }
        else        //栈为空
        {
                *node=NULL;        //把NULL赋给node所指的空间
               
                return NULL;
        }
}

//先序遍历二叉树
void perorder(b_tree root)
{
        link Stack=NULL;
        b_tree p=root;
        b_tree Node=NULL;
        while(p!=NULL||Stack!=NULL)                //当前指针p不为空或栈顶指针不为空时执行while循环
        {

                if(p!=NULL)        //当前指针p不为空时
                {

                        cout<<p->;data<<" ";        //输出p所指向的节点得数据data
                }
                else        //当前指针p为空时
                {
                        Stack=pop_stack(Stack,&Node);        //把栈顶元素弹出,把元素的值赋给Node
                       
                        if(Node!=NULL)        //弹出的元素不为空时
                        {
                                cout<<Node->;data<<" ";        //输出Node所指向的空间的数据值
                                p=Node;        //当前指针p指向Node
                        }
                }

                if(p->;right!=NULL)        //当前指针p所指节点的右孩子不为空时
                {
                        Stack=push_stack(Stack,p->;right);        //将其右孩子入栈
                }
                p=p->;left;        //当前指针p指向所指节点的左孩子
        }
}

void main()
{

        int temp=0;
        b_tree Root=NULL,Node;
        //用于输入数据
        while(1)       
        {
                Node=(b_tree)malloc(sizeof(treenode));
                cout<<"lease enter a number(Exit for 0):";
                cin>;>;temp;
                if(temp==0)        //如果输入的数据为0就退出while循环
                        break;
                Node->;data=temp;
                Node->;left=Node->;right=NULL;
                Root=create_btree(Root,Node);
        }
        cout<<"erorder travel Binary Tree:";
        perorder(Root);        //调用先序遍历二叉树函数perorder()
        cout<<endl;
}

论坛徽章:
0
2 [报告]
发表于 2004-04-28 07:41 |只看该作者

请各位帮忙看一下这条简单的程序(紧急)

没有要求别人无法替你回答问题.

论坛徽章:
0
3 [报告]
发表于 2004-04-28 13:20 |只看该作者

请各位帮忙看一下这条简单的程序(紧急)

哈哈,这个是干什么的类,有错误嘛??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP