树的宽度 递归法和非递归法
递归法思路:
建立一个数组,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(节点子树的高度即左子树高度,右子树高度的最大值) 代码如下: // Height_Recursive 递归法求树的高度 int Height_Recursi ...
- 二叉树的遍历:先序 中序 后序遍历的递归与非递归实现及层序遍历
二叉树的定义:一种基本的数据结构,是一种每个节点的儿子数目都不多于2的树 树节点的定义如下: // 树(节点)定义 struct TreeNode {int data; // 值TreeNode* l ...
- (伪代码)树的前中后遍历和层次遍历算法实现(考研适用,递归和非递归)
文章目录 前言 一.递归实现树的遍历 二.非递归实现 层次遍历 总结 前言 2022考研初试结束,总结了一些考研中基本常用算法.这篇主要是关于树的前中后遍历,递归实现和非递归实现两种,现在很多自命题在 ...
- python创建树结构、求深度_数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)...
前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...
- 树与二叉树的深度优先与广度优先算法(递归与非递归)
本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树 和 各种基本算法实现小结( ...
- 关于回溯法的递归与非递归-----N皇后问题
关于回溯法的递归与非递归-–N皇后问题 蓝桥杯 基础练习 2n皇后问题 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一 ...
- 树的递归与非递归遍历算法
树的递归与非递归遍历算法 树的递归与非递归遍历算法 树的遍历 实例 树遍历的口诀 树的递归遍历代码 树的先序遍历 树的中序遍历 树的后序遍历 递归遍历思想 树的非递归遍历 树的先序非递归遍历 先序遍历 ...
- 树的先序遍历,中序遍历,后续遍历(递归和非递归实现)
前序遍历是先访问根节点再访问左子树最后访问右子树(中,左,右):中序遍历是先访问左子树再访问根节点最后访问右子树(左,中,右):后序遍历是先访问左子树再访问右子树最后访问根节点(左,右,中).---- ...
- 二叉树的非递归遍历(递归和非递归)
二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅 ...
最新文章
- LeetCode简单题之完成一半题目
- 给你的网站穿上外衣 - HTTPS 免费部署指南
- from torchvision import _C解决办法
- python 爬虫工具
- EPML schema(附带用myeclipse生成的结构图)
- css 添加 referer,http中Referer和Referrer Policy
- java curl json_POST请求发送json数据java HttpUrlConnection
- 线程间的通信方式1--共享变量(内存)
- 基本机器学习面试问题 ---- Company/Industry Specific/Interest
- java集合—— 链表(java中的所有链表都是双向链表)
- 用Kickstart批量安装Linux系统、Kickstart安装,linux批量安装;Linux的Kickstart的 无人值守安装;linux pxe自动安装linux系统...
- 学习Nagios(三): NRPE安装及配置
- 西门子PLC S7-1200安装指南
- 三星s9Android9内测申请链接,国行三星S9/S9+开启安卓9.0内测
- python划分训练集、验证集和测试集
- 在mini2440上面搞定CC2500物理层驱动
- artifactory 误删除恢复
- 负载均衡集群技术介绍
- Linux下四款Web服务器压力测试工具…
- Android手机应用CTA认证自测
热门文章
- 云主机初体验(盛大云和阿里云)
- 用oracle的ODP.NET创建实体数据模型
- 改进客户合作关系,建立共赢的客户合作体系——来自项目管理群的讨论
- HDU - 6183 Color it(动态开点线段树/树状数组套动态开点线段树)
- POJ - 1922 Ride to School(思维+贪心)
- android 点击item跳转页面,Android RecyclerView Item 点击事件,简单
- java ee500错误_无法访问页面,500错误
- HDU3634(矩形切割)
- FFmpeg基本组成
- 长连接和Keepalive