1.创建结构体保存二叉树的节点,每个节点有值,左孩子,右孩子
template<class T> struct BinaryTreeNode { T _value; BinaryTreeNode<T>* _pLeft;//左孩子 BinaryTreeNode<T>* _pRight;//右孩子 BinaryTreeNode(const T& value) :_value(value) ,_pLeft(NULL) ,_pRight(NULL) {} };2.构造函数及拷贝构造函数
BinaryTree() :_pRoot(NULL) {} BinaryTree(const T array[],size_t size,const T& invalid)//构造函数 { size_t index=0; _CreateBinaryTree(_pRoot,array,size,index,invalid); } BinaryTree(const BinaryTree<T>& bt)//拷贝构造函数 { _pRoot=_CopyBinaryTree(bt._pRoot); }3.析构函数
~BinaryTree() { _DestroyBinaryTree(_pRoot); }4.创建二叉树的函数
void _CreateBinaryTree(Node* &pRoot,const T array[],size_t size,size_t& index,const T& invalid) { if(index<size&&invalid!=array[index]) { pRoot=new Node(array[index]); _CreateBinaryTree(pRoot->_pLeft,array,size,++index,invalid);//创建左子树 _CreateBinaryTree(pRoot->_pRight,array,size,++index,invalid);//创建右子树 } }5.拷贝函数
Node* _CopyBinaryTree(Node* pRoot)//拷贝 { Node* pNewRoot=NULL; if(pRoot) { //拷贝根节点 pNewRoot=new Node(pRoot->_value); //拷贝左子树 pNewRoot->_pLeft=_CopyBinaryTree(pRoot->_pLeft); //拷贝右子树 pNewRoot->_pRight=_CopyBinaryTree(pRoot->_pRight); } return pNewRoot; }6.销毁函数
void _DestroyBinaryTree(Node* &pRoot) { if(pRoot) { _DestroyBinaryTree(pRoot->_pLeft); _DestroyBinaryTree(pRoot->_pRight); delete pRoot; pRoot=NULL; } }7.二叉树的三种遍历
void _PreOrder(Node* pRoot)//前序遍历 { if(pRoot) { cout<<pRoot->_value<<" "; _PreOrder(pRoot->_pLeft); _PreOrder(pRoot->_pRight); } } void _InOrder(Node* pRoot)//中序遍历 { if(pRoot) { _InOrder(pRoot->_pLeft); cout<<pRoot->_value<<" "; _InOrder(pRoot->_pRight); } } void _PostOrder(Node* pRoot)//后序遍历 { if(pRoot) { _PostOrder(pRoot->_pLeft); _PostOrder(pRoot->_pRight); cout<<pRoot->_value<<" "; } }8.二叉树的基本操作
Node* _Find(Node* pRoot,const T& value)//根据值寻找二叉树中的相应结点 { if(NULL==pRoot) return NULL; if(pRoot->_value==value) return pRoot; Node* pCur=NULL; if(pCur=_Find(pRoot->_pLeft,value)) return pCur; return _Find(pRoot->_pRight,value); } Node* _Parent(Node* pRoot,Node* pCur)//获取双亲,pRoot为根节点 { assert(pCur); if(pRoot==NULL||pCur==pRoot) return NULL; if((pCur==pRoot->_pLeft)||(pCur==pRoot->_pRight)) return pRoot; Node* ret=NULL; if(ret=_Parent(pRoot->_pLeft,pCur)) return ret; else return _Parent(pRoot->_pRight,pCur); } Node* _LeftChild(Node* pRoot,Node* pCur)//寻找左孩子 { assert(pCur); if(pRoot!=NULL && pCur->_pLeft!=NULL) return pCur->_pLeft; Node* ret=NULL; if(ret=_LeftChild(pRoot->_pLeft,pCur)) return ret; else return _LeftChild(pRoot->_pRight,pCur); } Node* _RightChild(Node* pRoot,Node* pCur)//寻找右孩子 { assert(pCur); if(pRoot!=NULL && pCur->_pRight!=NULL) return pCur->_pRight; Node* ret=NULL; if(ret=_RightChild(pRoot->_pLeft,pCur)) return ret; else return _RightChild(pRoot->_pRight,pCur); } size_t _Height(Node* pRoot)//计算二叉树的深度 { int hl=0; int hr=0; int max=0; if(pRoot!=NULL) { hl=_Height(pRoot->_pLeft); hr=_Height(pRoot->_pRight); max=hl>hr?hl:hr; return max+1; } else return 0; } size_t _GetLeefCount(Node* pRoot)//计算叶子结点的个数 { if(pRoot==NULL) return 0; if(NULL==pRoot->_pLeft && NULL==pRoot->_pRight) return 1; return _GetLeefCount(pRoot->_pLeft)+_GetLeefCount(pRoot->_pRight); } size_t _GetKLevelCount(Node* pRoot,size_t k)//计算K行的节点个数 { if(pRoot==NULL||k<1) return 0; if(k==1) return 1; return _GetKLevelCount(pRoot->_pLeft,k-1)+_GetKLevelCount(pRoot->_pRight,k-1); } void _BinaryMirror(Node* pRoot)//镜像树 { if(pRoot) { std::swap(pRoot->_pLeft,pRoot->_pRight); _BinaryMirror(pRoot->_pLeft); _BinaryMirror(pRoot->_pRight); } }完整代码:
#include<iostream> #include<queue> #include<assert.h> using namespace std; template<class T> struct BinaryTreeNode { T _value; BinaryTreeNode<T>* _pLeft;//左孩子 BinaryTreeNode<T>* _pRight;//右孩子 BinaryTreeNode(const T& value) :_value(value) ,_pLeft(NULL) ,_pRight(NULL) {} }; template<class T> class BinaryTree { public: typedef BinaryTreeNode<T> Node; BinaryTree() :_pRoot(NULL) {} BinaryTree(const T array[],size_t size,const T& invalid)//构造函数 { size_t index=0; _CreateBinaryTree(_pRoot,array,size,index,invalid); } BinaryTree(const BinaryTree<T>& bt)//拷贝构造函数 { _pRoot=_CopyBinaryTree(bt._pRoot); } ~BinaryTree() { _DestroyBinaryTree(_pRoot); } BinaryTree<T>& operator=(const BinaryTree<T>& bt) { if(this!=&bt) { __DestroyBinaryTree(_pRoot); _pRoot=_CopyBinaryTree(bt._pRoot); } return *this; } void PreOrder()//前序遍历 { cout<<"PreOrder:"<<endl; _PreOrder(_pRoot); cout<<endl; } void InOrder()//中序遍历 { cout<<"InOrder:"<<endl; _InOrder(_pRoot); cout<<endl; } void PostOrder()//后序遍历 { cout<<"PostOrder:"<<endl; _PostOrder(_pRoot); cout<<endl; } void LevelOrder() { if(NULL==_pRoot) return; queue<Node*> q; q.push(_pRoot); cout<<"LevelOrder:"<<endl; while(!q.empty())//队列不为空 { Node* pCur=q.front();//取队头元素 if(pCur->_pLeft) q.push(pCur->_pLeft);//取左子树 if(pCur->_pRight) q.push(pCur->_pRight);//取右子树 cout<<pCur->_value<<" ";//访问队头 q.pop();//出队列 } cout<<endl; } Node* Find(const T& value)//找二叉树中某个结点 { Node* pCur=NULL; pCur=_Find(_pRoot,value); cout<<pCur->_value<<endl; return pCur; } Node* Parent(Node* pCur)//寻找双亲结点 { Node* result=NULL; result=_Parent(_pRoot,pCur); cout<<"Parent:"<<endl; cout<<result->_value<<endl; return result; } Node* LeftChild(Node* pCur)//寻找左孩子结点 { Node* result=NULL; result=_LeftChild(_pRoot,pCur); cout<<"LeftChild:"<<endl; cout<<result->_value<<endl; return result; } Node* RightChild(Node* pCur)//寻找右孩子结点 { Node* result=NULL; result=_RightChild(_pRoot,pCur); cout<<"RightChild:"<<endl; cout<<result->_value<<endl; return result; } size_t Height()//计算二叉树的深度 { size_t depth=0; depth=_Height(_pRoot); cout<<"Height:"<<depth<<endl; return depth; } size_t GetLeefCount() { size_t count=0; count=_GetLeefCount(_pRoot); cout<<"leefcount: "<<count<<endl; return count; } size_t GetKLevelCount(size_t k) { size_t count=0; count=_GetKLevelCount(_pRoot, k); cout<<"KLevelCount: "<<count<<endl; return count; } void BinaryMirror_Nor() { if(NULL==_pRoot) return; queue<Node*> q; q.push(_pRoot); while(!q.empty()) { Node* pCur=q.front(); if(pCur->_pLeft) q.push(pCur->_pLeft); if(pCur->_pRight) q.push(pCur->_pRight); std::swap(pCur->_pLeft,pCur->_pRight); q.pop(); } } void BinaryMirror() { _BinaryMirror(_pRoot); } private: void _CreateBinaryTree(Node* &pRoot,const T array[],size_t size,size_t& index,const T& invalid) { if(index<size&&invalid!=array[index]) { pRoot=new Node(array[index]); _CreateBinaryTree(pRoot->_pLeft,array,size,++index,invalid);//创建左子树 _CreateBinaryTree(pRoot->_pRight,array,size,++index,invalid);//创建右子树 } } Node* _CopyBinaryTree(Node* pRoot)//拷贝 { Node* pNewRoot=NULL; if(pRoot) { //拷贝根节点 pNewRoot=new Node(pRoot->_value); //拷贝左子树 pNewRoot->_pLeft=_CopyBinaryTree(pRoot->_pLeft); //拷贝右子树 pNewRoot->_pRight=_CopyBinaryTree(pRoot->_pRight); } return pNewRoot; } void _PreOrder(Node* pRoot)//前序遍历 { if(pRoot) { cout<<pRoot->_value<<" "; _PreOrder(pRoot->_pLeft); _PreOrder(pRoot->_pRight); } } void _InOrder(Node* pRoot)//中序遍历 { if(pRoot) { _InOrder(pRoot->_pLeft); cout<<pRoot->_value<<" "; _InOrder(pRoot->_pRight); } } void _PostOrder(Node* pRoot)//后序遍历 { if(pRoot) { _PostOrder(pRoot->_pLeft); _PostOrder(pRoot->_pRight); cout<<pRoot->_value<<" "; } } void _DestroyBinaryTree(Node* &pRoot) { if(pRoot) { _DestroyBinaryTree(pRoot->_pLeft); _DestroyBinaryTree(pRoot->_pRight); delete pRoot; pRoot=NULL; } } Node* _Find(Node* pRoot,const T& value)//根据值寻找二叉树中的相应结点 { if(NULL==pRoot) return NULL; if(pRoot->_value==value) return pRoot; Node* pCur=NULL; if(pCur=_Find(pRoot->_pLeft,value)) return pCur; return _Find(pRoot->_pRight,value); } Node* _Parent(Node* pRoot,Node* pCur)//获取双亲,pRoot为根节点 { assert(pCur); if(pRoot==NULL||pCur==pRoot) return NULL; if((pCur==pRoot->_pLeft)||(pCur==pRoot->_pRight)) return pRoot; Node* ret=NULL; if(ret=_Parent(pRoot->_pLeft,pCur)) return ret; else return _Parent(pRoot->_pRight,pCur); } Node* _LeftChild(Node* pRoot,Node* pCur) { assert(pCur); if(pRoot!=NULL && pCur->_pLeft!=NULL) return pCur->_pLeft; Node* ret=NULL; if(ret=_LeftChild(pRoot->_pLeft,pCur)) return ret; else return _LeftChild(pRoot->_pRight,pCur); } Node* _RightChild(Node* pRoot,Node* pCur) { assert(pCur); if(pRoot!=NULL && pCur->_pRight!=NULL) return pCur->_pRight; Node* ret=NULL; if(ret=_RightChild(pRoot->_pLeft,pCur)) return ret; else return _RightChild(pRoot->_pRight,pCur); } size_t _Height(Node* pRoot)//计算二叉树的深度 { int hl=0; int hr=0; int max=0; if(pRoot!=NULL) { hl=_Height(pRoot->_pLeft); hr=_Height(pRoot->_pRight); max=hl>hr?hl:hr; return max+1; } else return 0; } size_t _GetLeefCount(Node* pRoot) { if(pRoot==NULL) return 0; if(NULL==pRoot->_pLeft && NULL==pRoot->_pRight) return 1; return _GetLeefCount(pRoot->_pLeft)+_GetLeefCount(pRoot->_pRight); } size_t _GetKLevelCount(Node* pRoot,size_t k) { if(pRoot==NULL||k<1) return 0; if(k==1) return 1; return _GetKLevelCount(pRoot->_pLeft,k-1)+_GetKLevelCount(pRoot->_pRight,k-1); } void _BinaryMirror(Node* pRoot) { if(pRoot) { std::swap(pRoot->_pLeft,pRoot->_pRight); _BinaryMirror(pRoot->_pLeft); _BinaryMirror(pRoot->_pRight); } } private: Node* _pRoot; }; void Test() { char* pStr="124###35##6"; BinaryTree<char> bt1(pStr,strlen(pStr),'#'); bt1.PreOrder(); bt1.InOrder(); bt1.PostOrder(); //bt1.LevelOrder(); //bt1.Find('5'); //bt1.Parent(bt1.Find('5')); //bt1.LeftChild(bt1.Find('1')); //bt1.RightChild(bt1.Find('1')); //bt1.Height(); //bt1.GetLeefCount(); //bt1.GetKLevelCount(4); //bt1.BinaryMirror_Nor(); bt1.BinaryMirror(); /*cout<<endl; BinaryTree<char> bt2(bt1); bt2.PreOrder(); bt2.InOrder(); bt2.PostOrder(); cout<<endl; BinaryTree<char> bt3=bt1; bt3.PreOrder(); bt3.InOrder(); bt3.PostOrder();*/ } int main() { Test(); return 0; }