递归法思路:

树的高度即节点子树的高度+1(节点子树的高度即左子树高度,右子树高度的最大值)

代码如下:

// Height_Recursive 递归法求树的高度
int Height_Recursive(TreeNode* pTree) {if (pTree == NULL) {return 0;}// 分别求出左子树,右子树的高度,取最大值+1int leftHeight = Height_Recursive(pTree->left);int rightHeight = Height_Recursive(pTree->right);return (leftHeight > rightHeight ? leftHeight: rightHeight)+1;
}

非递归法思路:

借鉴程序遍历的思想,一层层的遍历,累加层数即可得到树的高度

代码如下:

// Height_No_Recursive 非递归法求树的高度
// 思路:借鉴层序遍历的思想,一层层的遍历,层数即高度
int Height_No_Recursive(TreeNode* pTree) {if (pTree == NULL) {return 0;}queue<TreeNode*> que;que.push(pTree);int height = 0;TreeNode* p = NULL;while(!que.empty()){height++;// 该层的节点个数,压入所有节点的孩子节点int num = que.size();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 height;
}

实验结果如下图:

完整代码如下:

#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);}
}// Height_Recursive 递归法求树的高度
int Height_Recursive(TreeNode* pTree) {if (pTree == NULL) {return 0;}// 分别求出左子树,右子树的高度,取最大值+1int leftHeight = Height_Recursive(pTree->left);int rightHeight = Height_Recursive(pTree->right);return (leftHeight > rightHeight ? leftHeight: rightHeight)+1;
}// Height_No_Recursive 非递归法求树的高度
// 思路:借鉴层序遍历的思想,一层层的遍历,层数即高度
int Height_No_Recursive(TreeNode* pTree) {if (pTree == NULL) {return 0;}queue<TreeNode*> que;que.push(pTree);int height = 0;TreeNode* p = NULL;while(!que.empty()){height++;// 该层的节点个数,压入所有节点的孩子节点int num = que.size();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 height;
}int main()
{TreeNode* pTree = NULL;createTree(pTree);cout<<"\n递归法求树的高度"<<endl;cout<<Height_Recursive(pTree)<<endl;cout<<"\n非递归法求树的高度"<<endl;cout<<Height_No_Recursive(pTree)<<endl;return 0;
}

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

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

    递归法思路: 建立一个数组,count[1]表第1层节点总数,即宽度,count[2]表第二层节点总数,依次类推 用先序遍历二叉树,每深入一层就把该层的节点个数加1,最大节点数即树的宽度 代码如下: ...

  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. 【Verilog HDL 训练】第 09 天(按键消抖)
  2. 小教活动总结-VB即时通讯小程序
  3. Android 利用sharepreference保存应用程序状态
  4. 教你些技巧,用 Python 自动化办公做一些有趣的事情!太方便了
  5. 二叉树节点为某一值的路径
  6. OpenCV调整图像的亮度
  7. 51CTO下载“开心辞典” 实现你的下载豆梦想【已结束】
  8. [Spring-cloud-eureka]使用 gradle, spring boot,Spring cloud Eureka 搭建服务提供者
  9. 零存整取 VS 定期一本通
  10. 关于程序员的冷笑话 (转载www.lenxiaohuadaquan.net )
  11. [从头读历史] 第276节 诗经 陈风
  12. html测试身高体重,【 身高体重测试】_如何测试_注意事项-大众养生网
  13. SimpleMind 1.27.1 小巧的思维导图工具
  14. 被遗忘的数学家!曾提出最接地气的数学定理,可以计算男朋友真不真心的那种......
  15. c++实现文件传输之三:断点续传与多线程传输转
  16. [Darktable]dt源码分析(未完)
  17. 比网易更狠!华为13年工龄员工离职被诉敲诈,羁押长达251天
  18. 网络爬虫入门——案例三:爬取大众点评的商户信息
  19. 随机过程 Brown 运动(上)
  20. 擅在各个现货黄金时间图捕捉时机

热门文章

  1. CodeForces - 1512G Short Task(欧拉筛求因子和)
  2. CodeForces - 856B Similar Words(AC自动机+树形dp)
  3. 牛客 - Gaming with Mia(dp)
  4. CodeForces - 1301F Super Jaber(bfs)
  5. 华为鲲鹏弹性云服务器KM1_#化鲲为鹏,我有话说# 鲲鹏弹性云服务器配置 Tomcat...
  6. 习题11-7 奇数值结点链表 (20 分) -链表
  7. C++虚继承(八) --- 虚继承与继承的差异
  8. ARP攻击实战之WinArpAttacker
  9. 非常精确的测试运行时间(比clock()更精确些)
  10. 原来!我在4年前就开始体验雾游戏了!