关于二叉树宽度的算法包括递归和非递归
2015-11-16 23:09
357 查看
//方法1:关于递归算法的实现,递归算法的实现包含两个函数,在这个函数中需要借助数组来实现
//实现的具体方式,是在循环遍历的过程中,将每一层中的节点数都存储到相应的数组空间中
//在对二叉树进行遍历结束后,在对数组进行处理,便可以获得,相应的二叉树的宽度
//子啊该方法的实现机制中,利用了辅助函数
//方法2:关于非递归的算法,就是利用队列的原理,这一原理在求树的深度那一篇博文,便已经涉及到了
//他的原理是每一此循环结束后,在队列中的永远是同一层的节点,不存在不是同一层的节点出现在队列中
//此时,通过获得队列的长度,便可以得到二叉树的宽度
void BinaryTree<T>::CountLine(BinaryTreeNode<T>* str,int* ptr,int i) {
//ptr是记录每层的节点数的数组,i是指树的某一层 if (str != NULL) { //每次递归都将该层的节点数加到相应的数组中去 ptr[i]++; CountLine(str->leftChild, ptr, i + 1); CountLine(str->rightChild, ptr, i + 1); } } template<typename T> int BinaryTree<T>::FindMaxLine() { //开辟相应的数组来存储每层的节点数 int height = Height(); int* str = new int[height]; for (int i = 0; i < height; i++) str[i] = 0; //获得节点数 CountLine(this->root, str, 0); int max = 0; //对数组进行处理,获得最大值 for (int i = 0; i < height; i++) { if (max < str[i]) max = str[i]; } return max; } template<typename T> int BinaryTree<T>::CountLine() { //利用非递归的方法求出每层的节点数 BinaryTreeNode<T>* str = this->root; if (str == NULL) return 0; queue<BinaryTreeNode<T>*>node; node.push(str); int max = 0; while (!node.empty()) { int cur = 0; int curSize = node.size(); while (cur < curSize) { cur++; str = node.front(); node.pop(); if (str->leftChild) node.push(str->leftChild); if (str->rightChild) node.push(str->rightChild); } if (max < curSize) max = curSize; } return max; }
相关文章推荐
- django小记
- 随笔
- 自执行or立即调用函数
- Linux 文件系统剖析
- 折线图(二)自定义LineChartView的折线图padding的长度
- 解决 IllegalStateException: Can not perform this action after onSaveInstanceState
- Codeforces Round #331 (Div. 2) C. Wilbur and Points
- 我在华为的日子
- 深入理解final
- HTML之常见测试网址
- cocos2d-js跑酷游戏实战笔记1
- GPUImage API 文档之GPUImageFilter类
- DTCMS自定义标签,tags分割
- WIN7下如何关闭任务端口
- Android  xml Animation  Drawable 画图
- 游戏开发中的矩阵初探
- FaceBook微光闪烁---第三方开源--shimmer-android
- 常用接口介绍03——485
- C++ OOP 之复制控制
- Android实战技巧之四十七:不用预览拍照与图片缩放剪裁