目录 (Table of Contents)
二叉树的操作
二叉树是一种特殊的树,在上一节中也介绍了树的其他形式,例如:霍夫曼树,B树等。其中,二叉树的常用操作有
1. 确定树高
2. 确定元素数目
3. 复制
4. 显示或打印二叉树
5. 确定两颗二叉树是否一样
6. 删除整颗树
这些操作都可以通过有步骤的遍历二叉树来完成,如果不知道如何遍历二叉树的话请返回:数据结构之二叉树(一)
二叉树的完整构建(续)
在构建二叉树,我们先要知道二叉树的数据成员和成员函数应该是什么。首先数据成员要有记录树节点的变量,以便我们返回树的节点个数,一个指向根节点的指针(可用于遍历操作等)。成员函数中,我们应该有上述提到的所有部分或全部操作(每个人的需求不一样,看自己的数据结构需要什么,自由组合等等)。因此代码实现为:
template <typename T>
class linkedBinaryTree : public binaryTree<binaryTreeNode<T>>
{
public:
linkedBinaryTree();
~linkedBinaryTree(erase(););
bool emtpy() const {return m_iTreeSize == 0; }
void preOrder(void (*theVisit)(binaryTreeNode<T>*))
{
visit = theVist;
preOrder(m_pRoot);
}
void inOrder(void (*theVisit)(binaryTreeNode<T>*))
{
visit = theVist;
inOrder(m_pRoot);
}
void postOrder(void (*theVisit)(binaryTreeNode<T>*))
{
visit = theVist;
postOrder(m_pRoot);
}
void int size() const {return m_iTreeSize; }
void levelOrder(void (*)(binaryTreeNode<T>*));
void erase()
{
postOrder(dispose);
m_pRoot = NULL;
treeSize = 0;
}
private:
int m_iTreeSize;
binaryTreeNode<T> *m_pRoot; // 指向根节点
static void (*visit))(binaryTreeNode<T> *); // 访问函数
static void preOrder(binaryTreeNode<T> *); // 前序遍历
static void inOrder(binaryTreeNode<T> *); // 中序遍历
static void dispose(binaryTreeNode<T> *t) {delete t;} // 后序遍历
}
注意事项:
void (*)(binaryTreeNode<T>*)
是一种函数类型,这种函数的返回值为void, 它的参数类型为binaryTreeNode<T> *, 即是一个指针
如何获取树的高度
思路:首先取它左子树的高度,然后取它右子树的高度,最后把左右子树高度的最大值加1,取得树的高度
删除整颗树
思路:前序或中序或后序遍历,每次遍历删除节点即可
比较两颗树是否相等
思路:如果两颗树的节点数不一样,则直接输出不相等,前序,中序或后序遍历每个节点的节点元素,两颗树进行数值比较
类的部分实现
遍历
template <typename T>
void linkedBinaryTree<T>::preOrder(binaryTreeNode<T> *t)
{
if(t != NULL)
{
linkedBinaryTree<T>::printvalue(t);
preOrder(t->leftChild);
preOrder(t->rightChild);
}
}
树的高度
template <typename T>
int linkedBinaryTree<T>::height(binaryTreeNode<T> *t)
{
if(t == NULL)
return 0;
int hl = height(t->leftChild);
int hr = height(t->rightChild);
if (hl > hr)
return ++hl;
else
return ++hr;
}