完整类实现:构造,析构,遍历二叉树
来源:互联网 发布:java开发年终总结范文 编辑:程序博客网 时间:2024/06/01 10:07
根据前面一个博文内容已经讲述了如何根据两种遍历方式进行构建二叉树
这里利用递归方式遍历二叉树,递归方式比较简单,后续补充其余非递归方式
再此主要是完善类的使用:
其中重点在于:接口定义
二叉树的析构删除
以及类成员变量中如果有指针,同时涉及复制构造函数和赋值操作符函数时需要用到的智能指针
如果接口方面定义不够好,还望包涵
如果有对智能指针不理解的地方,可以移步 http://blog.csdn.net/xietingcandice/article/details/39670269
.h文件
#include <iostream>#include <xtr1common>#include <stack>using namespace std;struct BinaryTreeNode{int Value;BinaryTreeNode * pLeft;BinaryTreeNode * pRight;BinaryTreeNode(){Value = 0;pLeft = NULL;pRight = NULL;}};BinaryTreeNode* ReconstructTree(int *startBackorder,int *endBackorder,int *startInorder,int *endInorder);void DeleteRoot(BinaryTreeNode *pRoot);class ScanBinaryTreeNode;//<因为遍历的类中出现了指针,为了防止copy函数和赋值操作符出现内存泄露定义智能指针对应的类class BinaryRoot{friend class ScanBinaryTreeNode; //<友元结构BinaryTreeNode *mpRoot; size_t mUse; BinaryRoot(BinaryTreeNode *pRoot):mpRoot(pRoot),mUse(1) {} //<初始化为1BinaryRoot():mpRoot(NULL),mUse(0){};//<默认构造函数 ~BinaryRoot();};class ScanBinaryTreeNode{public:ScanBinaryTreeNode(int *startBackOrder,int *endBackOrder, int *startInOrder,int *endInOrder);ScanBinaryTreeNode(){};ScanBinaryTreeNode(const ScanBinaryTreeNode &CopyTemp);ScanBinaryTreeNode& operator = (const ScanBinaryTreeNode &CopyTemp);~ScanBinaryTreeNode();void ScanPreOrder();void ScanInOrder();void ScanBackOrder();private:BinaryRoot* mpRootNode;};</span>
.c文件:
<span style="font-size:14px;">#include"BinaryTree.h"#define _CRTDBG_MAP_ALLOC#include <crtdbg.h>#include <stdlib.h> BinaryTreeNode* ReconstructTree(int *startBackorder,int *endBackorder,int *startInorder,int *endInorder)//<根据后续和中序遍历构建二叉树{BinaryTreeNode * root = new BinaryTreeNode;root->Value = * endBackorder;if (startBackorder == endBackorder) //<满足条件返回对应的根节点的值{if (startInorder == endInorder && (*startInorder == *startBackorder)){return root;}else{throw std::exception("Invalid input");}}int * rootInoder = startInorder;while ((rootInoder <= endInorder) && (*rootInoder != root->Value)){rootInoder++;}if (rootInoder > endInorder){throw std::exception("Invalid input");}int leftLength = rootInoder-startInorder;if (leftLength > 0){root->pLeft = ReconstructTree(startBackorder,startBackorder+leftLength-1,startInorder,rootInoder-1);}if ((endBackorder-startBackorder) > leftLength){root->pRight = ReconstructTree(startBackorder+leftLength,endBackorder-1,rootInoder+1,endInorder);}return root;}void DeleteRoot(BinaryTreeNode *pRoot) //<根据根节点删除整棵树 { if(pRoot == NULL) { return; } BinaryTreeNode * pLeft = pRoot->pLeft; BinaryTreeNode * pRight = pRoot->pRight; delete pRoot; pRoot = NULL; if(pLeft) { DeleteRoot(pLeft); } if(pRight) { DeleteRoot(pRight); } return; }BinaryRoot::~BinaryRoot() { DeleteRoot(mpRoot); } ScanBinaryTreeNode::ScanBinaryTreeNode(int *startBackOrder,int *endBackOrder, int *startInOrder,int *endInOrder){BinaryTreeNode *node = ReconstructTree(startBackOrder,endBackOrder,startInOrder,endInOrder);mpRootNode = new BinaryRoot(node); //<初始化一个指向根节点的指针}ScanBinaryTreeNode::ScanBinaryTreeNode(const ScanBinaryTreeNode &CopyTemp){mpRootNode = CopyTemp.mpRootNode;++mpRootNode->mUse;}ScanBinaryTreeNode::~ScanBinaryTreeNode(){if((--mpRootNode->mUse) == 0) //<指针没有对象的时候进行删除{delete mpRootNode;mpRootNode = NULL;}}ScanBinaryTreeNode& ScanBinaryTreeNode::operator = (const ScanBinaryTreeNode &CopyTemp){++ CopyTemp.mpRootNode->mUse; // if ( -- mpRootNode->mUse == 0) delete mpRootNode; mpRootNode = CopyTemp.mpRootNode; return *this; }void PreOrder(BinaryTreeNode *pRoot){if(pRoot == NULL){return;}printf("%d ",pRoot->Value);BinaryTreeNode *pLeft = pRoot->pLeft;BinaryTreeNode *pRight = pRoot->pRight;if(pLeft){PreOrder(pLeft);}if(pRight){PreOrder(pRight);}return;}void BackOrder(BinaryTreeNode *pRoot){if(pRoot == NULL){return;}BinaryTreeNode *pLeft = pRoot->pLeft;BinaryTreeNode *pRight = pRoot->pRight;if(pLeft){BackOrder(pLeft);}if(pRight){BackOrder(pRight);}printf("%d ",pRoot->Value);return;}void InOrder(BinaryTreeNode *pRoot){if(pRoot == NULL){return;}BinaryTreeNode *pLeft = pRoot->pLeft;BinaryTreeNode *pRight = pRoot->pRight;if(pLeft){InOrder(pLeft);}printf("%d ",pRoot->Value);if(pRight){InOrder(pRight);}return;}void ScanBinaryTreeNode::ScanPreOrder(){PreOrder(mpRootNode->mpRoot);}void ScanBinaryTreeNode::ScanBackOrder(){BackOrder(mpRootNode->mpRoot);}void ScanBinaryTreeNode::ScanInOrder(){InOrder(mpRootNode->mpRoot);}void Order(){int BackArry[8] = {7,4,2,5,8,6,3,1};int MiddleArry[8] = {4,7,2,1,5,3,8,6};if (BackArry == NULL || MiddleArry == NULL){return;}ScanBinaryTreeNode root(BackArry,BackArry+7,MiddleArry,MiddleArry+7);ScanBinaryTreeNode root1 = root;ScanBinaryTreeNode root2(root1);ScanBinaryTreeNode root3(root);root.ScanBackOrder();printf("\n");root.ScanInOrder();printf("\n");root.ScanPreOrder();}int main(){ Order();//int* i = new int;_CrtDumpMemoryLeaks();return 0;}</span>
0 0
- 完整类实现:构造,析构,遍历二叉树
- 二叉树实现(构造,遍历)-java
- 遍历构造二叉树
- 二叉树中序遍历线索完整实现
- 二叉查找树的构造与遍历[Java实现]
- 二叉树构造与遍历的C程序实现代码
- 二叉查找树的构造与遍历[Java实现]
- 数组实现根据二叉树的先序遍历和中序遍历构造二叉树
- 二叉树的构造 遍历
- 二叉树构造与遍历
- 二叉树--根据遍历构造二叉树
- C++ 二叉树Tree类 完整实现
- 由中序遍历序列和后序遍历序列构造二叉树(递归实现)
- 二叉树遍历 实现
- 二叉树完整实现C++
- 二叉树 --- 树的构造和遍历
- 由遍历序列构造二叉树
- 完全二叉树的构造与遍历
- elipse中配置jadclipe之后无法双击编译
- Servlet和JSP规范及版本对应关系
- unity之练习题
- 移动前端不得不了解的html5 head 头标签
- shell字符串总结
- 完整类实现:构造,析构,遍历二叉树
- 关于在MyEclipse中查看SVN服务器上的历史版本文件内容乱码的问题
- Activity的四种启动模式
- Rundll/Rundll32
- gradle学习(12)-groovy一些基础语法
- Generate Parentheses
- python学习笔记(一)
- 继明哥的否定之后,java泰又出新作!明哥接码!
- GCC -fno-omit-frame-pointer