| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3536 人关注过本帖
标题:程序运行的结果不一样,求教。谢谢(有时正确有时不正确,但是调试的时候是 ...
只看楼主 加入收藏
bh215124334
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-6-26
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:1 
程序运行的结果不一样,求教。谢谢(有时正确有时不正确,但是调试的时候是正确的)
程序如下,是按照先序输入构建二叉树并输出的。
用的方法是笨办法。
但是我想知道问题究竟出在哪里。
一步步调试了十来次,没有问题,运行的时候也大多没有问题,但是偶尔运行结果就不对了
测试数据有:ABC@@DE@G@@F@@@#以及ABD@@E@@CF@@G@@#
有时正常构建5层树,有时只有四层,有时则是三层(第一个测试数据)
程序代码:
#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
using namespace std;

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
    int Tag;
};
BinTree Insert(BinTree BST,char X);
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );
int GetHeight(BinTree Bt);

int main()
{
    char data[50],ex;
    int n;
    cin.getline(data,49);
    for(int i=0;i<49;i++)
    {
        if(data[i]=='#')
        {
            n=i;
            break;
        }
    }
    BinTree BST=NULL;
    for(int j=0;j<n;j++)
    {
        BST=Insert(BST,data[j]);
    }
    cout<<endl;
    PreorderTraversal(BST); 
    cout<<endl;
    InorderTraversal(BST);
    cout<<endl;
    PostorderTraversal(BST);
    cout<<endl;
    LevelorderTraversal(BST);
    cout<<endl;
    cout<<GetHeight(BST);
    system("pause");
    return 0;
}

BinTree Insert(BinTree BST,char X)
{
    if(!BST&&X!='@')
    {
        Position temp;
        temp=(Position)malloc(sizeof(Position));
        temp->Data=X;
        temp->Left=temp->Right=NULL;
        temp->Tag=2;
        return temp;
    }
    if(BST)
    {
        Position temp;
        switch(BST->Tag)
        {
            case 2:
                if(X=='@')
                {
                    BST->Tag--;
                    break;
                }
                temp=(Position)malloc(sizeof(Position));
                temp->Left=temp->Right=NULL;
                temp->Data=X;
                temp->Tag=2;
                BST->Left=temp;
                BST->Tag=1;
                break;
            case 1:
                if(BST->Right)
                {
                    BST->Right=Insert(BST->Right,X);
                    if(BST->Right->Tag==0) BST->Tag=0;                                        
                 } 
                 
                else if(BST->Left)
                {
                    if(BST->Left->Tag!=0)
                    {
                        BST->Left=Insert(BST->Left,X);                    
                    }
                    else if(X!='@')
                    {
                        temp=(Position)malloc(sizeof(Position));
                        temp->Left=temp->Right=NULL;
                        temp->Tag=2;
                        temp->Data=X;
                        BST->Right=temp;
                    }
                    else
                    {
                        BST->Tag--;                        
                    }
                }    
                else
                {
                    if(X!='@')
                    {
                        temp=(Position)malloc(sizeof(Position));
                        temp->Left=temp->Right=NULL;
                        temp->Tag=2;
                        temp->Data=X;
                        BST->Right=temp;
                    }
                    else
                    {
                        BST->Tag--;                        
                    }
                }            
                break;
            case 0:
                cout<<endl<<"错误"<<endl;
                break;    
        }
        return BST;
    }
    return BST;
}



//   InorderTraversal
void InorderTraversal(BinTree Bt)
{
    if(Bt)
    {
        InorderTraversal(Bt->Left);
        cout<<Bt->Data;
        InorderTraversal(Bt->Right);
    }
    return;
}
//   PreorderTraversal
void PreorderTraversal(BinTree Bt)
{
    if(Bt)
    {
        cout<<Bt->Data;
        PreorderTraversal(Bt->Left);
        PreorderTraversal(Bt->Right);
    }
    return;
}
//   PostorderTraversal
void PostorderTraversal(BinTree Bt)
{
    if(Bt)
    {
        PostorderTraversal(Bt->Left);
        PostorderTraversal(Bt->Right);
        cout<<Bt->Data;
    }
    return;
}
//   LevelorderTraversal
void LevelorderTraversal(BinTree Bt)
{
    BinTree ArrBt[100], T;
    int top=0;
    int head=0;
    if(!Bt) return;
    ArrBt[top++]=Bt;
    while(top!=head)
    {
        T=ArrBt[head++];
        cout<<T->Data;
        if(T->Left) ArrBt[top++]=T->Left;
        if(T->Right) ArrBt[top++]=T->Right;
    }
    cout<<endl;
    return;
}

int GetHeight(BinTree Bt)
{
    int a=0,b=0;
    if(Bt)
    {
        a=1+GetHeight(Bt->Left);
        b=1+GetHeight(Bt->Right);
        int c=a>b?a:b;
        return c;
    }
    return 0;
}

搜索更多相关主题的帖子: 二叉树 
2016-06-26 10:25
农民工
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:109
专家分:639
注 册:2015-8-22
收藏
得分:20 
请遵循这个规则:定义变量的同时请赋初值
2016-06-29 09:39
快速回复:程序运行的结果不一样,求教。谢谢(有时正确有时不正确,但是调试的时 ...
数据加载中...
 
   



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

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