📄 binarytree.h
字号:
#ifndef BinaryTree_H
#define BinaryTree_H
#include "BiTreeNode.h"
template<typename ElemType>
class BinaryTree
{
public:
typedef bool (*VisitFunc)(BiTreeNode<ElemType> *pNode);
public:
// class constructor
BinaryTree()
{
m_pRootNode = NULL;
}
// class destructor
~BinaryTree()
{
}
bool IsEmpty()
{
return m_pRootNode == NULL;
}
bool Root(ElemType& root) const
{
if (!IsEmpty())
{
root = m_pRootNode->Element();
return true;
}
else
{
return false;
}
}
void MakeTree(ElemType const& elem, BinaryTree<ElemType>* left = NULL, BinaryTree<ElemType>* right = NULL)
{
m_pRootNode = new BiTreeNode<ElemType>(elem, left, right);
left->Root(NULL);
right->Root(NULL);
}
void BreakTree(ElemType& elem, BinaryTree<ElemType>& left, BinaryTree<ElemType>& right)
{
if (m_pRootNode == NULL)
return;
elem = m_pRootNode->Element();
left->Root(m_pRootNode->Left());
right->Root(m_pRootNode->Right());
}
void PreOrder(VisitFunc visit)
{
preOrder(visit, m_pRootNode);
}
void InOrder(VisitFunc visit)
{
inOrder(Visit,m_pRootNode);
}
void PostOrder(VisitFunc visit)
{
postOrder(Visit,m_pRootNode);
}
protected:
void preOrder(VisitFunc visit, BiTreeNode<ElemType>* pNode)
{
if (pNode != NULL)
{
if (visit != NULL && !visit(pNode))
return false;
preOrder(pNode->Left());
preOrder(pNode->Right());
}
}
bool inOrder(BiTreeNode<ElemType>* pNode, VisitFunc pfnVisit)
{
if (pNode != NULL)
{
preOrder(pNode->Left());
if (visit != NULL && !visit(pNode))
return false;
preOrder(pNode->Right());
}
}
// Recurse in tree
bool postOrder(BiTreeNode<ElemType>* pNode, VisitFunc pfnVisit)
{
if (pNode != NULL)
{
preOrder(pNode->Left());
preOrder(pNode->Right());
if (visit != NULL && !visit(pNode))
return false;
}
}
private:
BiTreeNode<ElemType>* m_pRootNode;
};
#endif // BinaryTree_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -