exam4.cpp

来自「C++语言程序设计题典」· C++ 代码 · 共 229 行

CPP
229
字号
#include <iostream.h>
#include <malloc.h>
#define MaxSize 100
#define MaxWidth 40
typedef char elemtype;
typedef struct node
{
     elemtype data;
     struct node *left,*right;
} BTree;    //定义二叉树的类型
class Tree
{
	BTree *b;
    void printtree1(BTree *bt);
    void preorder1(BTree *);
    BTree *find1(BTree *,elemtype x);
    void inorder1(BTree *);
    void postorder1(BTree *);
    int treedepth1(BTree *);
public:
	Tree() { b=NULL; }
    void creatree(char *str);
    void disptree();
    void printree();
    void preorder();
    BTree *find(elemtype x);
    void inorder();
    void postorder();
    int treedepth();
};
void Tree::creatree(char *str)
{
   BTree *stack[MaxSize],*p;
   int top=-1,k,j=0;  //top为栈指针,k指定是左还是右孩子,j为str指针
   char ch;
   ch=str[j];
   while (ch!='\0')
   {
 	 switch(ch)
	 {
	    case '(':top++;stack[top]=p;k=1; break;  //为左结点
	    case ')':top--;break;
	    case ',':k=2; break;                     //为右结点
	    default: p=(BTree *)malloc(sizeof(BTree));
		     p->data=ch;p->left=p->right=NULL;
		     if (b==NULL)                        //根结点
			     b=p;
		     else
		     {
		       switch(k)
		       {
			       case 1:stack[top]->left=p;break;
			       case 2:stack[top]->right=p;break;
		       }
		     }
	 }
	 j++;
	 ch=str[j];
  }
}
void Tree::disptree()  //以凹入表表示法输出一棵二叉树
{
   BTree *stack[MaxSize],*p;
   int level[MaxSize][2],top,n,i,width=4;
   char type;
   if (b!=NULL)
   {
       top=1;
	   stack[top]=b;          //根结点入栈
	   level[top][0]=width;
	   level[top][1]=2;       //2表示是根
	   while (top>0)
       {
          p=stack[top];       //退栈并凹入显示该结点值
	      n=level[top][0];
		  switch(level[top][1])
		  {
  		      case 0:type='0';break;   //左结点之前输出(0)
		      case 1:type='1';break;   //右结点之前输出(1)
		      case 2:type='r';break;   //根结点之前输出(r)
		  }
	      for (i=1;i<=n;i++)  //其中n为显示场宽,字符以右对齐显示
	         cout << " ";
	      cout << p->data << " (" << type << ")";
	      for (i=n+1;i<=MaxWidth;i+=2)
	         cout << "━";
	      cout << endl;
	      top--;
          if (p->right!=NULL)
          {                         //将右子树根结点入栈
	         top++;
	         stack[top]=p->right;
	         level[top][0]=n+width; //显示场宽增width
			 level[top][1]=1;       //1表示是右子树
          }
          if (p->left!=NULL)
          {                         //将左子树根结点入栈
	        top++;
            stack[top]=p->left;
	        level[top][0]=n+width;  //显示场宽增width
			level[top][1]=0;        //0表示是左子树
          }
	   }
   }
}
void Tree::printree()
{
	printtree1(b);
}
void Tree::printtree1(BTree *bt)
{
   if (bt!=NULL)
   {
     cout << bt->data;
	 if (bt->left!=NULL || bt->right!=NULL)
	 {
	   cout << "(";
	   printtree1(bt->left);     //递归处理左子树
	   if (bt->right!=NULL) cout << ",";
	   printtree1(bt->right);    //递归处理右子树
	   cout << ")";
	 }
   }
}
void Tree::preorder()
{
	preorder1(b);
}
void Tree::preorder1(BTree *bt)
{
	if (bt!=NULL)
	{
		cout << bt->data << " ";
		preorder1(bt->left);
		preorder1(bt->right);
	}
}
BTree *Tree::find(elemtype x)
{
	return find1(b,x);
}
BTree *Tree::find1(BTree *bt,elemtype x)
{
	BTree *p;
	if (bt==NULL)
		return NULL;
	else if (bt->data==x)
		return bt;
	else
	{
		p=find1(bt->left,x);
		if (p!=NULL)
			return p;
		else
		   return find1(bt->right,x);
	}
}
void Tree::inorder()
{
	inorder1(b);
}
void Tree::inorder1(BTree *bt)
{
	if (bt!=NULL)
	{
		inorder1(bt->left);
		cout << bt->data << " ";
		inorder1(bt->right);
	}
}
void Tree::postorder()
{
	postorder1(b);
}
void Tree::postorder1(BTree *bt)
{
	if (bt!=NULL)
	{
		postorder1(bt->left);
		postorder1(bt->right);
		cout << bt->data << " ";
	}
}
int Tree::treedepth()
{
	return treedepth1(b);
}
int Tree::treedepth1(BTree *bt)
{
   int leftdep,rightdep;
   if (bt==NULL)         //空树的深度为0
	   return(0);
   else
   {
 	  leftdep=treedepth1(bt->left);
	  rightdep=treedepth1(bt->right);
	  if (leftdep>rightdep)
		  return (leftdep+1);
	  else
		  return (rightdep+1);
   }
}
void main()
{
	Tree bt;
	bt.creatree("(a(b(c),d(e(,f),g)))");
	cout << "嵌套表示法:\n    ";
	bt.printree();
    cout << endl << "\n凹入表示法:\n";
	bt.disptree();
	cout << endl;
	cout << "前序遍历序列:";
	bt.preorder();
	cout << endl;
	cout << "中序遍历序列:";
	bt.inorder();
	cout << endl;
	cout << "后序遍历序列:";
	bt.postorder();
	cout << endl;
	cout << "e结点是否在bt中:";
	if (bt.find('e')!=NULL)
		cout << "在" << endl;
	else
	    cout << "不在" << endl;
	cout << endl;

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?