》数据结构:typedef struct BINODE{TELEMETYPE data;struct BINODE *lchild,*rchild;}BiNode,*BiTtree;》递归函数int GetTreeDeep(BiTtree T)   //计算二叉树的深度{if(T==NULL)return 0;else{int a = GetTreeDeep(T->lchild);int b = GetTreeDeep(T->rchild);return (a>b)?(a+1):(b+1);}}


如(a)图,假设给出创建了这个二叉树,使用如上给出的递归实现的经典算法,这个递归过程是怎样的呢?

递归过程中GetTreeDeep这个函数被自身多次调用,让我们给它们标号:

函数 返回值 做什么? 步骤

GetTreeDeep —-》进入函数 —-》访问A 0

int a = GetTreeDeep(T->lchild); 1 —-》访问B 1

int a = GetTreeDeep(T->lchild); 0 —-》访问B的左空节点 2

int b = GetTreeDeep(T->rchild); 0 —-》访问B的右空节点 3

此时标号2,3函数完成,得到a=0,由步骤2,3得到步骤1函数的a值为1,再由步骤1得到步骤0对应的返回值为2,此时计算到树的高度为2,这只是根节点左部的子树高度,此时运行到刚开始进入函数内的第二个GetTreeDeep,所以接下来该访问右部子树:

int b = GetTreeDeep(T->rchild); —— 》访问C 4

int a = GetTreeDeep(T->lchild); 2 ——》访问D 5

int a = GetTreeDeep(T->lchild); 1 ——》访问F 6

int a = GetTreeDeep(T->lchild); 0 ——》访问F的左空节点 7

int b = GetTreeDeep(T->rchild); 0 ——》访问F的右空节点 8

步骤7,8的返回值为0,由此得到步骤6的返回值为1,步骤4对应的返回值为2,接下来,运行到该访问C的右节点:

int b = GetTreeDeep(T->rchild); ——》访问E 9

int a = GetTreeDeep(T->lchild); 1 ——》访问G 10

int a = GetTreeDeep(T->lchild); 0 ——》访问G的左空节点 11

int b = GetTreeDeep(T->rchild); 0 ——》访问G的右空节点 12

以此类推:可知步骤8的返回值为1,现在该访问E的右节点:

int b = GetTreeDeep(T->rchild); 1 ——》访问H 13

int a = GetTreeDeep(T->lchild); 0 ——》访问H的左空节点 14

int b = GetTreeDeep(T->rchild); 0 ——》访问H的右空节点 15

现在开始返回,比较各个节点的返回值孰大孰小

1, 首先比较的是步骤13和步骤10的返回值,二者一样大,返回1+1,步骤9得返回值2

2, 比较步骤9和5,二者同样为2,故步骤4的返回值为2+1,为3

3, 比较步骤4和步骤1,前者为3,后者为1,取前者,所以最后返回3+1,得步骤0的返回值为4,,即为最终结果。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree; //二叉树的建立
BiTree Create(BiTree T)
{ char ch;ch=getchar();if(ch=='#')T=NULL;else{if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))printf("空间分配有误!");T->data=ch;T->lchild=Create(T->lchild);T->rchild=Create(T->rchild);}return T;
}
//二叉树的前序递归遍历void Preorder(BiTree T)
{ if(T){printf("%c",T->data);Preorder(T->lchild);Preorder(T->rchild);}
}
//统计二叉树的结点个数
int Sumleaf(BiTree T)
{       if(T==NULL){return 0;}else{return Sumleaf(T->lchild)+Sumleaf(T->rchild)+1;}
}
//二叉树的中序递归遍历
void zhongxu(BiTree T)
{     if(T){zhongxu(T->lchild);printf("%c",T->data);zhongxu(T->rchild);}
}
//二叉树的后序递归遍历
void houxu(BiTree T)
{     if(T){houxu(T->lchild);houxu(T->rchild);printf("%c",T->data);}
}
//计算二叉树的深度
int Depth(BiTree T)
{     //每一层都是先找左再找右 int m,n;if(T==NULL){return 0;}else{m=Depth(T->lchild);n=Depth(T->rchild);if(m>n)return (m+1);elsereturn (n+1);}
}
int main()
{ BiTree T; int sum,dep; T=Create(T); Preorder(T); printf("\n"); zhongxu(T); printf("\n"); houxu(T); printf("\n"); sum=Sumleaf(T); printf("%d",sum); dep=Depth(T); printf("\n%d",dep);return 0;
}

二叉树求深度的递归的详细分析相关推荐

  1. 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现

    一.基本概念 每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒. 性质: 1.非空二叉树的第n层上至多有2^(n-1)个元素. 2.深度为h的二叉树至多有2^h-1个结点. 满二叉树:所有终端都 ...

  2. 二叉树的深度(递归+非递归)

    递归实现基本思想: 为了求得树的深度,可以先求左右子树的深度,取二者较大者加1即是树的深度,递归返回的条件是若节点为空,返回0 算法: int FindTreeDeep(BinTree BT){int ...

  3. 剑指offer面试题55 - I. 二叉树的深度(DFS)(递归)

    题目描述 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度. 思路 详见链接 代码 class Solution:def ...

  4. 深度学习最近发现详细分析报告

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 去年<二十不惑>和<三十而已>两部剧比较火 ...

  5. 【剑指offer-Java版】39二叉树的深度

    二叉树的深度:递归 判断二叉树是否是平衡二叉树:注意二叉树平衡代表的是所有非叶子节点都是一棵平衡树 – 而不仅仅是根节点 public class _Q39<T> {public int ...

  6. 【代码+注释】求二叉树的深度【超详细】递归+非递归实现

    编写算法求出二叉树的深度(层数) 二叉树的深度是指从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.本文将用两种方式求出二叉树的深度 第一种:无可置疑是递归 核 ...

  7. JAVA 二叉树 常见操作合集(前中后序递归非递归遍历 层序遍历 求深度宽度 判断兄弟结点 堂兄弟节点)

    今天复习了二叉树的相关操作,整理归纳如下. 二叉树结点定义 //节点类private static class TreeNode{private int val = 0;private TreeNod ...

  8. 递归法求二叉树的深度

    想要计算一个二叉树的深度,我们先可以拆成求根结点的左右子树的深度:而根结点的左右子树的深度又可拆成求根左结点的左右子树深度和根右结点的左右子树的深度.这样一层一层给套下去,很容易想到递归. 明确每一步 ...

  9. 2021-10-09 求二叉树的高度(递归和迭代版本)

    剑指 Offer 55 - I. 二叉树的深度 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度. 和题解写的一比,我写的 ...

最新文章

  1. AD9288的介绍和使用
  2. 【工作分解法】IT人,你的工作“轻松”么?
  3. WINCE6 同时支持简繁体
  4. 基于MVVM的知乎日报应用安卓源码
  5. 数据库中常见的面试问题(转)
  6. spring设置全局异常处理器
  7. 为什么我们要考虑线性规划的对偶问题?
  8. 运行CrossOver应用程序的四种方法
  9. RUBY常用类库文档翻译以及使用示例
  10. ElasticSearch全文搜索引擎之查询API篇
  11. 域名卡密自助授权系统
  12. 苹果cms视频模板源码
  13. 国内统一Android应用市场,最全最干净的安卓应用市场
  14. win10系统与时间服务器同步超时,如何解决Win10系统时间无法同步的问题?
  15. android icon换不掉图标文件夹,看烦了 Windows 原生文件夹图标?收下这套最全的更换图标教程...
  16. 苹果搜索广告ASA“保姆级”开户教程来袭!拿来吧你!
  17. 闪电分镜 一款影视前期策划的完美解决方案
  18. Caltech-UCSD Birds-200-2011
  19. 股票基本名词,你知道多少?
  20. FPGA控制DDS_AD9850输出正弦波(“并行spi”)

热门文章

  1. `CXXABI_1.3.8' not found (required by /usr/lib/x86_64-linux-gnu/libicuuc.so.55)
  2. ffmpeg编译 c++ 常量中有换行符
  3. FFMPEG 日志输出控制
  4. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)
  5. 使用Java泛型实现快速排序(快排,Quicksort)
  6. OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔总结
  7. php url重写配置,浅谈ThinkPHP的URL重写
  8. pycharm怎么写yaml_K8S 如何面向 Yaml 编程
  9. build怎么调试 react_webpack打包调试react并使用babel编译jsx配置方法
  10. oracle 中 to_date 函数的用法