根据前序和中序遍历的结果建立二叉树

题目是这样的:设二叉树的结点的数据场之值仅为一大写英文字母。其前序和中序的遍历结果(打印结点的数据场之值)分别保存在字符串数组 preorder[N] 及 inorder[N]之中,其中 N 为常数。请设计程序以标准形式形式存储保存该二叉树。

首先是二叉树的构造。二叉树的结点有一个数据域和两个指针域组成,分别指向其左右子树。以下是二叉树类的声明,主要包含负责建立和销毁以及遍历的函数。


template<class T>
struct BiNode
{
 T data;
 BiNode<T> *lchild,*rchild;
};

 

template<class T>
class BiTree
{
 public:
  BiTree();
  BiTree(string Pre,string In);
  ~BiTree();
  BiNode<T>* GetRoot() const;
  void PreOrder(BiNode<T> *root) const;
  void InOrder(BiNode<T> *root) const;
  void PostOrder(BiNode<T> *root) const;
  void LevelOrder(BiNode<T> *root) const;
 private:
  
  BiNode<T> *root;
  BiNode<T>* Creat(string Pre,string In);
  BiNode<T>* Creat();
  void Release(BiNode<T> *root);
}; 


二叉树的建立销毁和前序中序后序遍历都是通过递归来实现的,其代码如下。

 

二叉树的建立:通过键盘输入结点的数据建立二叉树,输入#结点为空。


template<class T>
BiTree<T>::BiTree()
{
 this->root = Creat( );
}

 

template<class T>
BiNode<T>* BiTree<T>::Creat()
{
 BiNode<T>* root;
 T ch;
 cin>>ch;
    if (ch =='#')
  root = NULL;
    else{
      root = new BiNode<T>;       //生成一个结点
         root->data=ch;
         root->lchild = Creat( );    //递归建立左子树
         root->rchild = Creat( );    //递归建立右子树
    }
    return root;
}


使构造函数调用私有函数Creat(),再通过键盘输入结点的数据建立二叉树,输入#结点为空。

 

二叉树的销毁:


template<class T>
BiTree<T>::~BiTree()
{
 Release(root);
}

前序 中序 后序遍历:
template<class T>
void BiTree<T>::PreOrder(BiNode<T> *root) const
{
 if(root==NULL)
  return;
 else
 {
  cout<<root->data<<" ";
  PreOrder(root->lchild);
  PreOrder(root->rchild);
 }
}

 


template<class T>
void BiTree<T>::InOrder(BiNode<T> *root) const
{
 if(root==NULL)
  return;
 else
 {
  InOrder(root->lchild);
  cout<<root->data<<" ";  
  InOrder(root->rchild);
 }
}


template<class T>
void BiTree<T>::PostOrder(BiNode<T> *root) const
{
 if(root==NULL)
  return;
 else
 {
  PostOrder(root->lchild);  
  PostOrder(root->rchild);
  cout<<root->data<<" "; 
 }
}

 


 

对于二叉树的层序遍历,是通过使用队列来实现的。简单的说就是若第k层的结点处于队列中,在依次出队和输出其数据的同时,将其左右子结点(即k+1层的结点) 入队。

 


 

template<class T>
void BiTree<T>::LevelOrder(BiNode<T> *root) const
{
 int front=0,rear=0;  //采用顺序队列,并假定不会发生上溢
 BiNode<T> *Q[100],*q;
 if(root==NULL)
  return;
 Q[++rear]=root;
 while(front!=rear)
 {
  q=Q[++front];
  cout<<q->data<<" ";
  if(q->lchild!=NULL)
   Q[++rear]=q->lchild;
  if(q->rchild!=NULL)
   Q[++rear]=q->rchild;
 }
 cout<<endl;
}

 


 

至此完成了二叉树的基本构建。根据题目的要求,在此基础上重载构造函数和私有函数Creat(),实现通过前序和中序遍历的结果建立二叉树。代码如下:

 


 

template<class T>
BiTree<T>::BiTree(string Pre,string In)
{
 this->root=Creat(Pre,In);
}
template<class T>
BiNode<T>* BiTree<T>::Creat(string Pre,string In)

 BiNode<T> *root=new BiNode<T>;
 if(Pre.empty()==true)
 {
  root=NULL;
  return root;
 }

 string LeftPre,LeftIn,RightPre,RightIn;
 char strRoot;
 int mid,length;

 strRoot=Pre[0];  //在前序中找到根结点字符
 length=Pre.length();
 mid=In.find(strRoot,0);  //在中序中找到根结点字符的位置

 LeftIn=In.substr(0,mid); 
 RightIn=In.substr(mid+1,length-mid-1);
 LeftPre=Pre.substr(1,mid);
 RightPre=Pre.substr(mid+1,length-mid-1);

 root->data=strRoot;
 root->lchild=Creat(LeftPre,LeftIn);
 root->rchild=Creat(RightPre,RightIn);

 return root;
}


 

同样使用了递归的方法将问题分治,在具体实现时借助string类的方法拆分字符串后传递参数。

 

 


 

可以通过此链接下载本程序:http://cid-24fba8dfcc188fae.skydrive.live.com/self.aspx/Public/BinaryTree.rar

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值