二叉树的深度(递归+非递归)
来源:互联网 发布:淘宝正品代购店铺推荐 编辑:程序博客网 时间:2024/06/07 12:48
题目:输入一颗二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
路径的长度:即路径中所包含的节点数。
有两种实现方式:递归 和 非递归
(1)递归
算法思想:
<1> 如果一棵树只有一个节点,它的深度为1。如果根节点只有左子树而没有右子树,那么树的深度应该是其左子树的深度加1;
<2> 同样如果根节点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加1。
<3> 如果既有左子树又有右子树,那该树的深度就是其左、右子树深度的较大值再加1。
(2)非递归
在文章“二叉树的分层打印(一)”的基础上,稍作修改即可。即借助队列,在进行按层遍历时,记录遍历的层数。
具体实现如下:
#include <iostream>using namespace std;#include <deque>typedef struct node{ char data; struct node *lchild; struct node *rchild;}BiNode, *BiTree;// 先序建立二叉树 (输入时,按先序次序输入二叉树中结点的值,以 # 字符表示空树)BiTree createBiTree(){ BiTree T; char c; scanf("%c", &c); if (c == '#') T = NULL; else { T = new BiNode; // 或 T = (BiTree)malloc(sizeof(BiNode)); T->data = c; T->lchild = createBiTree(); T->rchild = createBiTree(); } return T;}// 二叉树的深度(递归)int treeDepth(BiTree T){ if (T == NULL) return 0; int depLeft = treeDepth(T->lchild); int depRight = treeDepth(T->rchild); return (depLeft > depRight) ? (depLeft + 1) : (depRight + 1);}// 二叉树的深度(非递归)int treeDepth2(BiTree T){ if(T == NULL) return 0; deque<BiTree> q; q.push_back(T); int curLevelNum; // 当前层的节点数 int curLevel = 0; // 层数 while (q.size()) { curLevelNum = (int)q.size(); // 此处要做类型转换,因为size()返回值为size_type类型; while(curLevelNum-- > 0) // 一直访问到当前层的最后一个节点 { BiTree tmp = q.front(); q.pop_front(); if(tmp->lchild) q.push_back(tmp->lchild); if(tmp->rchild) q.push_back(tmp->rchild); } curLevel++; } return curLevel;}int main(int argc, const char * argv[]) { BiTree T = createBiTree(); // 建立 // 递归// int depth = treeDepth(T);// printf("树的深度为 = %d\n", depth); // 非递归 int depth2 = treeDepth2(T); printf("树的深度为 = %d\n", depth2); return 0;}
1 0
- 二叉树的深度(递归+非递归)
- 二叉树的深度(递归+非递归)
- 二叉树的深度(递归和非递归)
- 非递归求二叉树的深度
- 二叉树的深度优先遍历(递归、非递归),广度优先遍历(递归)
- 二叉树递归、非递归求深度
- 求二叉树的深度,递归与非递归算法
- 求二叉树的深度递归与非递归版
- 二叉树的遍历,递归和非递归,求深度
- 二叉树的深度,递归和非递归实现
- 二叉树的深度遍历---递归&非递归
- 二叉树的深度 (递归与非递归方法整理)
- 求解二叉树的深度(递归和非递归)
- 求二叉树深度的递归和非递归算法
- 求二叉树的深度 递归 非递归
- 二叉树的节点个数和深度(非递归)
- 二叉树的最小深度(非递归)
- 二叉树深度求解(递归,非递归)
- 根据时间按年、月、日、分组、排序
- Espresso:快速的Android UI自动化测试
- Java抽象
- CSS妙用垂直居中对齐一行中多个元素
- web测试内容及工具经典总结
- 二叉树的深度(递归+非递归)
- 查看日志
- HDU-2006
- JavaScript笔记(5)严格模式
- Oracle 获取本周、本月、本季、本年的第一天和最后一天
- css实现图片转动
- 条款一:*{margin:0; padding:0;},清除有可能的默认脏边距;
- AndroidManifest.xml清单配置文件的相关介绍一
- c++ 中 const_iterator 和 const vector<>::iterator的区别