# 二叉树实现类 —— 三叉链表实现

#include <iostream>

using namespace std;

enum Statue
{
TRUE, FALSE, INSERT_ERROR
};

//二叉树的三叉链表节点结构
template <class NodeType> class BinaryNode
{
public:
NodeType value;
BinaryNode<NodeType> *parent, *lChild, *rChild;

BinaryNode();
};

template <class NodeType>
BinaryNode<NodeType>::BinaryNode()
{
parent = NULL;
lChild = NULL;
rChild = NULL;
}

//二叉树类，三叉链表实现
template <class NodeType> class BinaryTree
{
public:
BinaryTree();
BinaryTree(BinaryNode<NodeType> *root);
~BinaryTree();
void DestroyTree();

void CreatBinaryTree(BinaryNode<NodeType> *root);
Statue IsEmpty();								//判断是否为空树
int GetDepth(BinaryNode<NodeType> *node);		//计算从node节点开始的树的层数
BinaryNode<NodeType>* Find(NodeType value);		//在二叉树中寻找值为value的节点，如有重复则返回中序遍历的第一个。PS:NodeType需要重载==符号
Statue InsertChild(BinaryNode<NodeType> *nodeParent, BinaryNode<NodeType> *node, BinaryNode<NodeType> *child);	//往node节点位置插入child节点
void DeleteTree(BinaryNode<NodeType> *node);	//删除node节点为根的树，同时释放其占用内存

private:
BinaryNode<NodeType> *root;
BinaryNode<NodeType>* FindFrom(BinaryNode<NodeType> *from, NodeType value);
};

template <class NodeType>
BinaryTree<NodeType>::BinaryTree()
{
root = NULL;
}

template <class NodeType>
BinaryTree<NodeType>::BinaryTree(BinaryNode<NodeType> *root)
{
CreatBinaryTree(root);
}

template <class NodeType>
void BinaryTree<NodeType>::DestroyTree()
{
DeleteTree(root->lChild);
DeleteTree(root->rChild);
delete(root);
}

template <class NodeType>
BinaryTree<NodeType>::~BinaryTree()
{
DestroyTree();
}

template <class NodeType>
Statue BinaryTree<NodeType>::IsEmpty()
{
return (NULL == root) ? TRUE : FALSE;
}

template <class NodeType>
int BinaryTree<NodeType>::GetDepth(BinaryNode<NodeType> *node)
{
if (NULL == node)
{
return 0;
}

int lDepth, rDepth;
lDepth = GetDepth(node->lChild);
rDepth = GetDepth(node->rChild);
return (lDepth > rDepth) ? lDepth + 1 : rDepth + 1;
}

template <class NodeType>
void BinaryTree<NodeType>::CreatBinaryTree(BinaryNode<NodeType> *node)
{
if (NULL == node)
{
DestroyTree();
root = NULL;
return ;
}

root = new BinaryNode<NodeType>;
root->value = node->value;
InsertChild(root, root->lChild, node->lChild);
InsertChild(root, root->rChild, node->rChild);
}

template <class NodeType>
Statue BinaryTree<NodeType>::InsertChild(BinaryNode<NodeType> *nodeParent, BinaryNode<NodeType> *node, BinaryNode<NodeType> *child)
{
Statue result = INSERT_ERROR;

if (NULL == child)
{
DestroyTree();
result = TRUE;
return result;
}

node = new BinaryNode<NodeType>;
node->parent = nodeParent;

result = InsertChild(node, node->lChild, child->lChild);
if (INSERT_ERROR == result)
{
return result;
}

result = InsertChild(node, node->rChild, child->rChild);
return result;
}

template <class NodeType>
void BinaryTree<NodeType>::DeleteTree(BinaryNode<NodeType> *node)
{
if (NULL = node)
{
return;
}

DeleteTree(node->lChild);
DeleteTree(node->rChild);

free(node);
node = NULL;
}

template <class NodeType>
BinaryNode<NodeType>* BinaryTree<NodeType>::FindFrom(BinaryNode<NodeType> *from, NodeType value)
{
if (NULL == from)
{
return NULL;
}

if (from->value == value)
{
return from;
}

BinaryNode<NodeType> * findresult;
findresult = FindFrom(from->lChild, value);

if (NULL == findresult)
{
findresult = FindFrom(from->rChild, value);
}

return findresult;
}

template <class NodeType>
BinaryNode<NodeType>* BinaryTree<NodeType>::Find(NodeType value)
{
return FindFrom(root, value);
}

• 本文已收录于以下专栏：

举报原因： 您举报文章：二叉树实现类 —— 三叉链表实现 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)