【数据结构·树】树的基操 之 先序构造树并先序,中序,后序遍历输出;(附:控制遍历时的输出格式;RE的一个原因;)C++

附:

1.控制遍历时的输出格式:

设置全局变量 bool sign;

调用遍历函数前,令sign等于true;

遍历函数内设置语句:

        if(sign)sign=false;
        else cout<<',';
        cout<<T->data;

2.RE的一个原因:返回值为bool或其它非void的函数体内未设置return语句;

输入说明:

第一行:表示无孩子或指针为空的特殊分隔符

第二行:二叉树的先序序列(结点元素之间以空格分隔)

输出说明:

第一行:二叉树先序遍历结果

第二行:二叉树中序遍历结果

第三行:二叉树后序遍历结果

输入范例:

null
A B null C D null null E null null F null G null H null null

输出范例:

A,B,C,D,E,F,G,H
B,D,C,E,A,F,G,H
D,E,C,B,H,G,F,A

代码:

#include<iostream>
#include <sstream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<vector>
#include <climits>
#define MAX_SIZE 100
using namespace std;
bool sign;
//结点
template<class ElemType>
struct BinaryTreeNode
{
       ElemType data;
       BinaryTreeNode<ElemType> *LChild, *RChild;
       BinaryTreeNode() : LChild(NULL), RChild(NULL){}
       BinaryTreeNode(const ElemType &item, BinaryTreeNode<ElemType> *Lptr = NULL, BinaryTreeNode<ElemType> *Rptr = NULL)
       {
           LChild = Lptr;
           RChild = Rptr;
           data = item;
       }
};
//二叉树
template<class ElemType>
class BinaryTree
{
   private:
      BinaryTreeNode<ElemType> *root;
   public:
      BinaryTree():root(NULL){}
      BinaryTree(const ElemType &item){root = new BinaryTreeNode<ElemType>(item);}
      void makeBinaryTree( const ElemType &item, BinaryTree &left, BinaryTree &right);
      //返回二叉树结点的个数

      int BinaryTreeSize( BinaryTreeNode<ElemType> *T ) const;

      //判断二叉树是否为空

      bool BinaryTreeisEmpty() const{return root == NULL;}

      //获取根结点元素值

      ElemType GetRootData() const{ return root->data;}
      void SetRoot(BinaryTreeNode<ElemType> * p){ root = p;}
      BinaryTreeNode<ElemType> * GetRoot() const{ return root;}
      bool PreOrderTraverse( BinaryTreeNode<ElemType> *T );  //前序遍历(递归)//num的初始值为0,作用为控制输出格式(最后1个结点后不加“,”)
      bool InOrderTraverse( BinaryTreeNode<ElemType> *T );  //中序遍历(递归)
      bool PostOrderTraverse( BinaryTreeNode<ElemType> *T );  //后序遍历(递归)
      BinaryTreeNode<ElemType>* CreateBinaryTree(vector<ElemType> &x, ElemType &empty, int &n);
};
template<class ElemType>
bool BinaryTree<ElemType>::PreOrderTraverse( BinaryTreeNode<ElemType> *T )
{
    if(T)
    {
        if(sign)sign=false;
        else cout<<',';
        cout<<T->data;
        PreOrderTraverse(T->LChild);
        PreOrderTraverse(T->RChild);
        return true;
    }
    return false;
}
template<class ElemType>
bool BinaryTree<ElemType>::InOrderTraverse( BinaryTreeNode<ElemType> *T )
{
    if(T)
    {
        InOrderTraverse(T->LChild);
        if(sign)sign=false;
        else cout<<',';
        cout<<T->data;
        InOrderTraverse(T->RChild);
        return true;
    }
    return false;
}
template<class ElemType>
bool BinaryTree<ElemType>::PostOrderTraverse( BinaryTreeNode<ElemType> *T )
{
    if(T)
    {
        PostOrderTraverse(T->LChild);
        PostOrderTraverse(T->RChild);
        if(sign)sign=false;
        else cout<<',';
        cout<<T->data;
        return true;
    }
    return false;
}
template<class ElemType>
BinaryTreeNode<ElemType>* BinaryTree<ElemType>::CreateBinaryTree(vector<ElemType> &x, ElemType &empty, int &n)
{
        ElemType ch = x[n];//string
        n++;
        if (ch == empty)
        {
            return NULL;
        }
        else
        {
            BinaryTreeNode<ElemType> *Node = new BinaryTreeNode<ElemType>;
            Node->data = ch;
            Node->LChild = CreateBinaryTree(x, empty, n);
            Node->RChild = CreateBinaryTree(x, empty, n);
            return Node;
        }
}
template<class ElemType>
void CreateTree(BinaryTree<ElemType> &T, ElemType &str, ElemType &empty)
{
    ElemType tmp;
    vector<ElemType> t;
    stringstream input_T(str);
    while(input_T >> tmp)
    {
         t.push_back(tmp);
    }
    BinaryTreeNode<ElemType> *root;
    int num = 0;
    root = T.CreateBinaryTree(t, empty, num);
    T.SetRoot(root);
}
int main()
{
    BinaryTree<string> T;
    string str;
    string empty;
    getline(cin,empty);
    getline(cin,str);
    CreateTree(T,str,empty);
    sign=true;
    T.PreOrderTraverse(T.GetRoot());cout<<endl;
    sign=true;
    T.InOrderTraverse(T.GetRoot());cout<<endl;
    sign=true;
    T.PostOrderTraverse(T.GetRoot());cout<<endl;
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值