递归法思路:

建立一个数组,count[1]表第1层节点总数,即宽度,count[2]表第二层节点总数,依次类推
用先序遍历二叉树,每深入一层就把该层的节点个数加1,最大节点数即树的宽度

代码如下:

// Width_No_Recursive 非递归法求树的宽度
// 思路:借鉴层序遍历的思想,一层层的遍历,所有层中最大宽度,即树的宽度
int Width_No_Recursive(TreeNode* pTree) {if (pTree == NULL) {return 0;}queue<TreeNode*> que;que.push(pTree);int max_weight = 1;TreeNode* p = NULL;while(!que.empty()){// 该层的节点个数,即该层的宽度// 弹出该层的节点后,再压入所有节点的孩子节点,即下一层的节点int num = que.size();if (num > max_weight) {max_weight = num;}for (int i=0;i<num;i++){p = que.front();que.pop();if (p->left != NULL){que.push(p->left);}if (p->right != NULL){que.push(p->right);}}}return max_weight;
}

非递归法思路:

借鉴层序遍历的思想,一层层的遍历,所有层中最大宽度,即树的宽度

代码如下:

// 统计第level层的节点树
void width(TreeNode* pTree, int* count, int level, int& max)
{if (pTree == NULL){   return;}// 该层次节点数加1count[level]++;// max一直保存最大宽度if (count[level] > max){max = count[level];}// 往下层递归width(pTree->left,count,level+1,max);width(pTree->right,count,level+1,max);
}// Width_Recursive 递归法求树的宽度
// 思路:建立一个数组,count[1]表第1层节点总数,即宽度,count[2]表第二层节点总数,依次类推
// 用先序遍历二叉树,每深入一层就把该层的节点个数加1,最大节点数即树的宽度
int Width_Recursive(TreeNode* pTree)
{if (pTree == NULL) {return 0;}int count[100] = {0};   // 全局数组int max = 0;            // 宽度//递归求树的最大宽度width(pTree,count,1,max);return max;
}

实验结果如下图:

完整代码如下:

#include<iostream>
#include<queue>
using namespace std;// 树(节点)定义
struct TreeNode
{int            data; // 值TreeNode* left; // 左节点TreeNode*   right;// 右节点
};// 按照前序建立二叉树,这里我们建立下面的树
//          8
//      6       10
//    4   7         12
//                11
// 所以输入顺序是:8 6 4 0 0 7 0 0 10 0 12 11 0 0 0
void createTree(TreeNode*& t)
{   cout<<"请输入数据:"<<endl;int val = 0;cin>>val;// 0表结束if (0 == val){t = NULL;}else {t = new TreeNode();t->data = val;cout<<"开始建立:"<<val<<"的左节点:";createTree(t->left);cout<<"开始建立:"<<val<<"右节点:";createTree(t->right);}
}// 统计第level层的节点树
void width(TreeNode* pTree, int* count, int level, int& max)
{if (pTree == NULL){   return;}// 该层次节点数加1count[level]++;// max一直保存最大宽度if (count[level] > max){max = count[level];}// 往下层递归width(pTree->left,count,level+1,max);width(pTree->right,count,level+1,max);
}// Width_Recursive 递归法求树的宽度
// 思路:建立一个数组,count[1]表第1层节点总数,即宽度,count[2]表第二层节点总数,依次类推
// 用先序遍历二叉树,每深入一层就把该层的节点个数加1,最大节点数即树的宽度
int Width_Recursive(TreeNode* pTree)
{if (pTree == NULL) {return 0;}int count[100] = {0};   // 全局数组int max = 0;            // 宽度//递归求树的最大宽度width(pTree,count,1,max);return max;
}// Width_No_Recursive 非递归法求树的宽度
// 思路:借鉴层序遍历的思想,一层层的遍历,所有层中最大宽度,即树的宽度
int Width_No_Recursive(TreeNode* pTree) {if (pTree == NULL) {return 0;}queue<TreeNode*> que;que.push(pTree);int max_weight = 1;TreeNode* p = NULL;while(!que.empty()){// 该层的节点个数,即该层的宽度// 弹出该层的节点后,再压入所有节点的孩子节点,即下一层的节点int num = que.size();if (num > max_weight) {max_weight = num;}for (int i=0;i<num;i++){p = que.front();que.pop();if (p->left != NULL){que.push(p->left);}if (p->right != NULL){que.push(p->right);}}}return max_weight;
}int main()
{TreeNode* pTree = NULL;createTree(pTree);cout<<"\n递归法求树的宽度"<<endl;cout<<Width_Recursive(pTree)<<endl;cout<<"\n非递归法求树的宽度"<<endl;cout<<Width_No_Recursive(pTree)<<endl;return 0;
}

树的宽度 递归法和非递归法相关推荐

  1. 树的高度 递归法和非递归法

    递归法思路: 树的高度即节点子树的高度+1(节点子树的高度即左子树高度,右子树高度的最大值) 代码如下: // Height_Recursive 递归法求树的高度 int Height_Recursi ...

  2. 二叉树的遍历:先序 中序 后序遍历的递归与非递归实现及层序遍历

    二叉树的定义:一种基本的数据结构,是一种每个节点的儿子数目都不多于2的树 树节点的定义如下: // 树(节点)定义 struct TreeNode {int data; // 值TreeNode* l ...

  3. (伪代码)树的前中后遍历和层次遍历算法实现(考研适用,递归和非递归)

    文章目录 前言 一.递归实现树的遍历 二.非递归实现 层次遍历 总结 前言 2022考研初试结束,总结了一些考研中基本常用算法.这篇主要是关于树的前中后遍历,递归实现和非递归实现两种,现在很多自命题在 ...

  4. python创建树结构、求深度_数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)...

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

  5. 树与二叉树的深度优先与广度优先算法(递归与非递归)

    本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树   和  各种基本算法实现小结( ...

  6. 关于回溯法的递归与非递归-----N皇后问题

    关于回溯法的递归与非递归-–N皇后问题 蓝桥杯 基础练习 2n皇后问题 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一 ...

  7. 树的递归与非递归遍历算法

    树的递归与非递归遍历算法 树的递归与非递归遍历算法 树的遍历 实例 树遍历的口诀 树的递归遍历代码 树的先序遍历 树的中序遍历 树的后序遍历 递归遍历思想 树的非递归遍历 树的先序非递归遍历 先序遍历 ...

  8. 树的先序遍历,中序遍历,后续遍历(递归和非递归实现)

    前序遍历是先访问根节点再访问左子树最后访问右子树(中,左,右):中序遍历是先访问左子树再访问根节点最后访问右子树(左,中,右):后序遍历是先访问左子树再访问右子树最后访问根节点(左,右,中).---- ...

  9. 二叉树的非递归遍历(递归和非递归)

    二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅 ...

最新文章

  1. LeetCode简单题之完成一半题目
  2. 给你的网站穿上外衣 - HTTPS 免费部署指南
  3. from torchvision import _C解决办法
  4. python 爬虫工具
  5. EPML schema(附带用myeclipse生成的结构图)
  6. css 添加 referer,http中Referer和Referrer Policy
  7. java curl json_POST请求发送json数据java HttpUrlConnection
  8. 线程间的通信方式1--共享变量(内存)
  9. 基本机器学习面试问题 ---- Company/Industry Specific/Interest
  10. java集合—— 链表(java中的所有链表都是双向链表)
  11. 用Kickstart批量安装Linux系统、Kickstart安装,linux批量安装;Linux的Kickstart的 无人值守安装;linux pxe自动安装linux系统...
  12. 学习Nagios(三): NRPE安装及配置
  13. 西门子PLC S7-1200安装指南
  14. 三星s9Android9内测申请链接,国行三星S9/S9+开启安卓9.0内测
  15. python划分训练集、验证集和测试集
  16. 在mini2440上面搞定CC2500物理层驱动
  17. artifactory 误删除恢复
  18. 负载均衡集群技术介绍
  19. Linux下四款Web服务器压力测试工具…
  20. Android手机应用CTA认证自测

热门文章

  1. 云主机初体验(盛大云和阿里云)
  2. 用oracle的ODP.NET创建实体数据模型
  3. 改进客户合作关系,建立共赢的客户合作体系——来自项目管理群的讨论
  4. HDU - 6183 Color it(动态开点线段树/树状数组套动态开点线段树)
  5. POJ - 1922 Ride to School(思维+贪心)
  6. android 点击item跳转页面,Android RecyclerView Item 点击事件,简单
  7. java ee500错误_无法访问页面,500错误
  8. HDU3634(矩形切割)
  9. FFmpeg基本组成
  10. 长连接和Keepalive