1. 程式人生 > >廣義表表示樹二叉樹

廣義表表示樹二叉樹

HeadMain.h

#include<iostream>
using namespace std;
#include"BTree.h"

BTree.h

struct TreeNode
{
  char data;
  TreeNode *left;
  TreeNode *right;
  TreeNode()
  {
     data=0;
  left=NULL;
  right=NULL;
  }
};


class CBTree
{
 public:
  TreeNode *BT;
  CBTree();
  ~CBTree();
  void InitBTree(TreeNode *BT);
  void CreateBTree( TreeNode *&BT,char * item);
  bool IsEmptyBTree(TreeNode * BT);
  int  DepthBTree(TreeNode *BT);
  bool FindBTree(TreeNode * BT ,int &item);
  void PrintBTree(TreeNode *BT);
  void ClearBTree(TreeNode *BT);
  void PreOrder(TreeNode *BT);
};

BTree.cpp

#include"HeadMain.h"
/*
  通過廣義表表示樹的結果的連結儲存的實現
  A(B(E,F),D(E),G)


*/
CBTree::CBTree()
{
   BT=NULL;
}
CBTree::~CBTree()
{
  delete BT;
}
void CBTree::InitBTree(TreeNode *BT)
{
   BT=NULL;
}
void CBTree::CreateBTree(TreeNode *&BT,char* a)
{  
 const int  MaxSize=10;
    TreeNode  *s[MaxSize];
 int i=0;
 int  top=-1;
 BT=NULL;
 TreeNode *p;
 int k;
 while(a[i])
 {
  switch(a[i])
  {
  case ' ':
    break;
  case '(':
   if(top ==MaxSize-1)
   {
      cout<<"棧空間太小,請增加Maxsize的值"<<endl;
      exit(1);
   }
   top++;
   s[top]=p;
   k=1;
   break;
  case ')':
   if(top==-1)
   {
    cout<<"二叉樹廣義表定義錯誤!"<<endl;
    exit(1);
   }
   top--;
   break;
  case ',':
   k=2;
   break;
  default:
   p= new TreeNode();
   p->data=a[i];
   if(BT==NULL)
   {
    BT=p;
   }
   else
   {
    if(k==1)
    {
     s[top]->left=p;
    }
    else s[top]->right=p;
   }
  }
  i++;
 }

}
bool CBTree::IsEmptyBTree(TreeNode * BT)
{
  if(BT==NULL)
  return true;
  return false;
}
int  CBTree::DepthBTree(TreeNode *BT)
{
  //if(BT==NULL)
  //return 0;
  //else
  //{
  // int dep1=DepthBTree(BT->left);
  // int dep2=DepthBTree(BT->right);
  // if(dep1>dep2)
  // {
  //   return  dep1+1;
  //    }
  // else
  // {
  //   return  dep2+1;
  // }
  //}
 TreeNode *temp=BT;
 int i=0;
 int j=0;
 while(temp!=NULL)
 {
  temp=temp->left;
  i++;
 }
 TreeNode *temp1=BT;
 while(temp1!=NULL)
 {
  temp1=temp1->right;
     j++;
 }
 if(i>j)
  return i;
 return j;

}
bool CBTree::FindBTree(TreeNode * BT ,int &x)
{
 if(BT==NULL)
 {
   return false;
 }
 else
 {
  if(BT->data==x)
  {
   x=BT->data;return true;
  }
  else
  {
   if(FindBTree(BT->left,x))return true;
   if(FindBTree(BT->right,x))return true;
   return false;
  }
 }
 return true;
}
void CBTree::PrintBTree(TreeNode *BT)
{
 if(BT!=NULL)
 {
  cout<<BT->data<<"  ";
  if(BT->left!=NULL  || BT->right!=NULL)
  {
    cout<<'(';
    PrintBTree(BT->left);
    if(BT->right!=NULL)
     cout<<',';
    PrintBTree(BT->right);
    cout<<')';
  }
 }
}

void CBTree::PreOrder(TreeNode *BT)
{   cout<<endl;
 if(BT!=NULL)
 {
  cout<<BT->data<<"  ";
  PrintBTree(BT->left);
  PrintBTree(BT->right);
 }
}

void CBTree::ClearBTree(TreeNode *BT)
{
 if(BT!=NULL)
 {
  ClearBTree(BT->left);
  ClearBTree(BT->right);
  delete BT;
  BT=NULL;
 }
}

main.cpp

#include"HeadMain.h"
void main()
{

 char b[20];
    TreeNode  *BT=NULL;
    CBTree  *tree = new CBTree();
 tree->InitBTree(BT);
 cin.getline(b,sizeof(b));
 tree->CreateBTree(BT,b);
 tree->PrintBTree(BT);
 cout<<endl;
 cout<<tree->DepthBTree(BT);
 tree->PreOrder(BT);
}