实现功能
本文代码实现了二叉树的以下操作:
- 无返回值的流创建。
- 带返回值的流创建。
- 无返回值的字符串创建。
- 带返回值的字符串创建。
- 前序、中序、后序递归遍历二叉树。
- 前序、中序、后序迭代遍历二叉树。
- 拷贝二叉树。
- 求二叉树大小。
- 求二叉树高度。
- 查找二叉树中的某个元素。
- 查找二叉树某个节点的父节点。
- 查找二叉树中某热节点的子节点。
- 清空二叉树。
- 比较两棵二叉树。
- 打印某个二叉树节点。
- 等等。
测试
- 功能测试:文中所有代码均通过少量功能测试,并贴出了部分测试代码。代码未进行大量用例测试。
- 边界值测试:未进行边界值测试。
- 特殊输入测试:未进行特殊输入测试。
欢迎交流讨论,欢迎批评指正!
核心代码
#ifndef _BINARY_TREE_H
#define _BINARY_TREE_H
#include<iostream>
#include<stack>
#include<queue>
#include<assert.h>
template<typename T>
class BinaryTree;
template<typename T>
class BinaryTreeNode
{
friend BinaryTree<T>;
public:
BinaryTreeNode() : data(T()),left(nullptr), right(nullptr) {}
BinaryTreeNode(T _data, BinaryTreeNode<T> * left = nullptr, BinaryTreeNode<T> * right = nullptr)
: data(_data), left(nullptr), right(nullptr) {}
private:
T data;
BinaryTreeNode<T> * left;
BinaryTreeNode<T> * right;
};
template<typename T>
class BinaryTree
{
typedef BinaryTreeNode<T> NodeType;
public:
BinaryTree() = default;
BinaryTree(const T& ref) : refval(ref) {}
BinaryTree(const BinaryTree &);
~BinaryTree();
public:
// create binary by cin/string
void createBT();
void createBT(const char *&);
NodeType * createBT_Ret();
NodeType * createBT_Ret(const char *&);
// traverse recur/iter
void preorderTraverse_Recur() const;
void inorderTraverse_Recur() const;
void postorderTraverse_Recur() const;
void preorderTraverse_Iter() const;
void inorderTraverse_Iter() const;
void postorderTraverse_Iter() const;
void levelTraverse() const;
void zigzagTraverse() const;
// get size of tree
size_t size() const;
// get height of tree
size_t height() const;
// get child node
NodeType * leftChild(const NodeType *) const;
NodeType * rightChild(const NodeType *) const;
// get parent node
NodeType * parent(const NodeType *) const;
// find given value node;
NodeType * find(const T &) const;
// judge if two trees are same
bool equal(BinaryTree &) const;
// print tree node
void print(const NodeType *) const;
// clear the tree
void makeEmpty();
protected:
NodeType * _copyTree(NodeType *);
void _createBT(NodeType *&);
void _createBT(NodeType *&, const char *&);
NodeType * _createBT_Ret();
NodeType * _createBT_Ret(const char *&);
void _preorderTraverse_Recur(NodeType *) const;
void _inorderTraverse_Recur(NodeType *) const;
void _postorderTraverse_Recur(NodeType *) const;
void _preorderTraverse_Iter(NodeType *) const;
void _inorderTraverse_Iter(NodeType *) const;
void _postorderTraverse_Iter(NodeType *) const;
void _levelTraverse(NodeType *) const;
void _zigzagTraverse(NodeType *) const;
size_t _size(NodeType *) const;
size_t _height(NodeType *) const;
NodeType * _parent(NodeType *, const NodeType *) const;
NodeType * _find(NodeType *, const T &) const;
bool _equal(NodeType *, NodeType *) const;
void _makeEmpty(NodeType *);
private:
T refval;
NodeType * root;
};
//******************** public interface ********************
template<typename T>
BinaryTree<T>::BinaryTree(cons