64,282
社区成员
发帖
与我相关
我的任务
分享
#ifndef binaryTreeNode_
#define binaryTreeNode_
template <class T>
struct binaryTreeNode
{
T element;
binaryTreeNode<T> *leftChild,
*rightChild;
binaryTreeNode() {leftChild = rightChild = NULL;}
binaryTreeNode(const T& theElement):element(theElement)
{
leftChild = rightChild = NULL;
}
binaryTreeNode(const T& theElement,
binaryTreeNode *theLeftChild,
binaryTreeNode *theRightChild)
:element(theElement)
{
leftChild = theLeftChild;
rightChild = theRightChild;
}
};
#endif
#ifndef linkedBinaryTree_
#define linkedBinaryTree_
using namespace std;
#include <iostream>
#include "binaryTreeNode.h"
template<class E>
class linkedBinaryTree
{
public:
linkedBinaryTree()
{
root = NULL;
treeSize = 0;
}
bool empty() const
{
return treeSize == 0;
}
int size() const
{
return treeSize;
}
void makeTree(const E& element,
linkedBinaryTree<E>&, linkedBinaryTree<E>&);
void preOrder(void(*theVisit)(binaryTreeNode<E>*))
{
visit = theVisit;
preOrder(root);
}
void preOrderOutput()
{
preOrder(output);
cout << endl;
}
protected:
binaryTreeNode<E> *root; // pointer to root
int treeSize; // number of nodes in tree
static void (*visit)(binaryTreeNode<E>*); // visit function
static void preOrder(binaryTreeNode<E> *t);
static void output(binaryTreeNode<E> *t)
{
cout << t->element << " ";
}
};
//void (*linkedBinaryTree<int>::visit)(binaryTreeNode<int>*);
template<class E>
void linkedBinaryTree<E>::makeTree(const E& element,
linkedBinaryTree<E>& left, linkedBinaryTree<E>& right)
{
// Combine left, right, and element to make new tree.
// left, right, and this must be different trees.
// create combined tree
root = new binaryTreeNode<E> (element, left.root, right.root);
treeSize = left.treeSize + right.treeSize + 1;
// deny access from trees left and right
left.root = right.root = NULL;
left.treeSize = right.treeSize = 0;
}
template<class E>
void linkedBinaryTree<E>::preOrder(binaryTreeNode<E> *t)
{
// Previous order traversal.
if (t != NULL)
{
linkedBinaryTree::visit(t);
preOrder(t->leftChild);
preOrder(t->rightChild);
}
}
#endif
// test linked binary tree class
#include <iostream>
#include "linkedBinaryTree.h"
using namespace std;
int main(void)
{
linkedBinaryTree<int> a,x,y,z;
y.makeTree(1,a,a);
z.makeTree(2,a,a);
x.makeTree(3,y,z);
y.makeTree(4,x,a);
cout << "Number of nodes = ";
cout << y.size() << endl;
cout << "Preorder sequence is ";
y.preOrderOutput();
return 0;
}
linkedBinaryTree<E>::visit = nullptr;
由于使用了模板,编译器提示“ E was not declared in this cope"
[/quote]
补充:
先在linkedBinaryTree里声明函数类型typedef void (*visitfun)(binaryTreeNode<E>*);
然后在类外
template<class E>
typename linkedBinaryTree<E>::visitfun linkedBinaryTree<E>::visit = nullptr; [/quote]
这下可以了。谢谢您!linkedBinaryTree<E>::visit = nullptr;
由于使用了模板,编译器提示“ E was not declared in this cope"
[/quote]
补充:
先在linkedBinaryTree里声明函数类型typedef void (*visitfun)(binaryTreeNode<E>*);
然后在类外
template<class E>
typename linkedBinaryTree<E>::visitfun linkedBinaryTree<E>::visit = nullptr; linkedBinaryTree<E>::visit = nullptr;
由于使用了模板,编译器提示“ E was not declared in this cope"
linkedBinaryTree<E>::visit = nullptr;
由于使用了模板,编译器提示“ E was not declared in this cope"