树的基本操作
树的类定义
template <class T>
class Tree
{
public:
Tree();
}
二叉树结点的类定义
template <class T>
struct BinTreeNode
{
T data;
BinTreeNode<T> *lchild, *rchild;
BinTreeNode(){lchild = NULL; rchild == NULL}
BinTreeNode(T &x, BinTreeNode *l = NULL, BinTreeNode *r = NULL)
{
data = x;
lchild = l;
rchild = r;
}
}
二叉树的类定义
template <class T>
class BinaryTree
{
public:
BinaryTree(BinaryTree<T> *lchild, BinaryTree<T> *rchild,
T item);
void InOrder(BinTreeNode<T> *subTree);
void PreOrder(BinTreeNode<T> *subTree);
void PostOrder(BinTreeNode<T> *subTree);
void Create(BinaryTree &t);
int Height();
int Size();
private:
BinTreeNode<T> *root;
}
template <class T>
void BinTreeNode<T> :: InOrder(BinTreeNode<T> *subTree)
{
if(subTree != NULL)
{
InOrder(subTree -> lchild);
visit(subTree);
InOrder(subTree -> rchild);
}
}
template <class T>
void BinTreeNode<T> :: PreOrder(BinTreeNode<T> *subTree)
{
if(subTree != NULL)
{
visit(subTree);
InOrder(subTree -> lchild);
InOrder(subTree -> rchild);
}
}
template <class T>
void BinTreeNode<T> :: PostOrder(BinTreeNode<T> *subTree)
{
if(subTree != NULL)
{
InOrder(subTree -> lchild);
InOrder(subTree -> rchild);
visit(subTree);
}
}
template <class T>
int BinaryTree<T> :: Size(BinTreeNode<T> *subTree)
{
if(subTree == NULL)
return 0;
else
{
return 1+Size(subTree -> lchild)+Size(subTree -> rchild);
}
}
template <class T>
int BinaryTree<T> :: Height(BinTreeNode<T> *subTree)
{
if(subTree == NULL)
return 0;
else
{
int i = Height(subTree -> lchild);
int j = Height(subTree -> rchild);
return (i>j) ? i+1:j+1;
}
}
前序遍历建立二叉树
void Create(BinaryTree &t)
{
T c;
cin >> c;
if('#' == c) /*输入结束标识符*/
t = NULL;
else
{
t = new BinaryTreeNode<T>;
t -> data = c;
Create(t -> lchild);
Create(t -> rchild);
}
}
BFS
template <class T>
void BreadFirstSearch(BinaryTree<T> *root)
{
Queue<BinTreeNode *> nodeQueue;
nodeQueue.EnQueue(root);
BinTreeNode *node;
while(!nodeQueue.IsEmpty())
{
node = nodeQueue.front();
cout << node -> data << endl;
nodeQueue.DeQueue(node);
if(node -> lchild)
nodeQueue.EnQueue(node -> lchild);
if(node -> rchild)
nodeQueue.EnQueue(node -> rchild);
}
}
DFS
template <class T>
void DepthFirstSearch(BinaryTree<T> *root)
{
Stack<BinTreeNode *> nodeStack;
nodeStack.push(root);
while(!nodeStack.IsEmpty())
{
root = nodeStack.top();
cout << root -> data << endl;
nodeStack.pop();
if(root -> lchild)
nodeStack.push(root -> lchild);
if(root -> rchild)
nodeStack.push(root -> rchild);
}
}