C ++模板中的二叉树

时间:2013-06-26 23:34:39

标签: c++ templates data-structures tree

我尝试在C ++模板中编写一个简单的二叉树。在main()的第二行,我想声明

Node<string,Node,int> 

第二个Node是错误的,因为它是一个类模板,必须实例化为

Node<string,Node<string,int,int>,int>

但随着树的增长,类型会增长。我怎样才能使用第一个声明?谢谢!

我的C ++编译器是g ++ 4.8.1,支持C ++ 11。

#include <iostream>
#include <string>

using namespace std;

template<typename T, typename Tl, typename Tr>
struct Node {
  // tree node
  T top;
  Tl left;
  Tr right;
  Node (const T& t=T(),const Tl& tl=Tl(),const Tr& tr=Tr()):
    top(t), left(tl), right(tr){}

};

int main() {
  Node <string,int,int> n1 (string("+"), 1, 2);
  // !!!wrong , should be Node<string,Node<string,int,int>,int>
  Node<string,Node,int> n2 (string("*"), n1, 4);
}

更新

我添加了指向struct的指针。如何让它变得更好?谢谢!

#include <iostream>
#include <string>

using namespace std;

template<typename T=string, typename Tl=int, typename Tr=int>
struct Node {
  // tree node
  struct Node<T,Tl,Tr>* p_left;
  struct Node<T,Tl,Tr>* p_right;
  T top;
  Tl left;
  Tr right;
  Node (struct Node<T,Tl,Tr>* pl=nullptr, struct Node<T,Tl,Tr>* pr=nullptr,
        const T& t=T(),const Tl& tl=Tl(),const Tr& tr=Tr()):
    p_left(pl), p_right(pr), top(t), left(tl), right(tr){}
};

using tnode = struct Node<>;

int main() {
  tnode n1 (nullptr,nullptr,string("+"), 1, 2);
  tnode n2 (&n1, nullptr,string("*"), 0,0);
}

更新2 ,添加智能指针。

#include <iostream>
#include <string>
#include <memory>

using namespace std;

template<typename T=string, typename Tc=int>
class Node {
public:
  Node (shared_ptr<Node> pl=nullptr, 
        shared_ptr<Node> pr=nullptr,
        const T& t=T(),
        const Tc& tl=Tc(),
        const Tc& tr=Tc()):
    p_left(pl), p_right(pr), v_top(t), v_left(tl), v_right(tr){}

  ~Node() {
    cout<<"Calling destructor"<<endl;
  }
private:
  shared_ptr<Node> p_left;
  shared_ptr<Node> p_right;
  T v_top;
  Tc v_left,v_right;
};

using tNode = Node<>;
using spNode = shared_ptr<tNode>;

spNode create_tree() {
  spNode n0 = make_shared<tNode>(nullptr,nullptr,string("*"), 7, 3);
  spNode n1 = make_shared<tNode>(nullptr,n0,string("+"), 5, 6);
  spNode n2 = make_shared<tNode>(n1, nullptr,string("+"), 3,4);
  return n2;    
}

int main() {
  spNode n2 = create_tree();
}

1 个答案:

答案 0 :(得分:0)

获取template<typename>class NodeMaker,将父Node类型传递给两个子参数。

template<typename T>using Same=T;和templatestruct fixed {templateusing type = X;}`。

现在,

Node<string, Same, fixed<int>::template type>

制作你想要的类型。

作为一个问题,此类型的大小无限:您需要一种让Node内的Node消失的方法。使用std::unique_ptr<>来抓住你的左右孩子?