这是一个比较全面的二叉树的实现,包括建立,遍历,大小,深度,删除等操作的实现。
利用递归,可以很简单很快捷的实现对二叉树的操作
BinaryTree.hpp
#pragma once #include<iostream> using namespace std; #include<queue> template<class T> struct BinaryTreeNode{ //结点的结构体 char _value; BinaryTreeNode* _left; BinaryTreeNode* _right; BinaryTreeNode(char value) :_value(value) ,_left(NULL) , _right(NULL) {} }; template<class T> class BinaryTree{ public: BinaryTree() //空二叉树构造函数 :_root(NULL) {} BinaryTree(const char* str):_root(NULL){ //非空二叉树构造函数 _CreateBinaryTree(_root,str); } BinaryTree(const BinaryTree& t){ //拷贝构造函数 _root = _Copy(t._root); } BinaryTree &operator =(const BinaryTree& t){ //重载函数 swap(_root, t._root); return *this; } ~BinaryTree(){ //析构函数 _Delete(_root); } void PrevOrder(){ //先序遍历 _PrevOrder(_root); cout << endl; } void InOrder(){ //中序遍历 _InOrder(_root); cout << endl; } void PostOrder(){ //后序遍历 _PostOrder(_root); cout << endl; } void LevelOrder(){ //层遍历 _LevelOrder(_root); cout << endl; } int Size(){ //二叉树值结点个数 return _Size(_root); } int Depth(){ //二叉树的深度 return _Depth(_root); } protected: void _CreateBinaryTree(BinaryTreeNode<T>*& root, const char*& str){ //创建二叉树 if (*str != '#' && *str != '\0'){ root = new BinaryTreeNode<T>(*str); _CreateBinaryTree(root->_left, ++str); _CreateBinaryTree(root->_right, ++str); } } BinaryTreeNode<T>* _Copy(BinaryTreeNode<T>* root){ //拷贝 BinaryTreeNode<T>* _new = NULL; if (root){ _new = new BinaryTreeNode<T>(root->_value); while (root){ _new->_left = _Copy(root->_left); _new->_right = _Copy(root->_right); return _new; } } return _new; } BinaryTreeNode<T>* _Delete(BinaryTreeNode<T>* root){ //释放 while (root){ _Delete(root->_left); _Delete(root->_right); delete root; return root; } return root; } void _PrevOrder(BinaryTreeNode<T>* root){ //先序 if (root){ cout << root->_value << " "; _PrevOrder(root->_left); _PrevOrder(root->_right); } } void _InOrder(BinaryTreeNode<T>* root){ //中序 if (root){ if (root->_left == NULL && root->_right == NULL) cout << root->_value << " "; else{ _InOrder(root->_left); cout << root->_value << " "; _InOrder(root->_right); } } } void _PostOrder(BinaryTreeNode<T>* root){ //后序 if (root){ if (root->_left == NULL && root->_right == NULL) cout << root->_value << " "; else{ _PostOrder(root->_left); _PostOrder(root->_right); cout << root->_value << " "; } } } void _LevelOrder(BinaryTreeNode<T>* root){ //层 queue<BinaryTreeNode<T>*> q; q.push(root); while (root){ cout << root->_value << " "; if (!q.empty()){ BinaryTreeNode<T>* front = q.front(); q.pop(); q.push(front->_left); q.push(front->_right); } root = q.front(); } } int _Size(BinaryTreeNode<T>* root){ //大小 int count = 0; if (root){ count += _Size(root->_left); count += _Size(root->_right); } if (root) return count + 1; else return count; } int _Depth(BinaryTreeNode<T>* root){ //深度 int left_depth = 0; int right_depth = 0; if (root){ left_depth = _Depth(root->_left); right_depth = _Depth(root->_right); return (left_depth > right_depth) ? left_depth + 1 : right_depth + 1; } else return 0; } private: BinaryTreeNode<T>* _root; };