二叉树求深度的递归的详细分析

来源:互联网 发布:mac u盘安装win7教程 编辑:程序博客网 时间:2024/06/03 07:18

二叉树求深度的递归的详细分析

二叉树求深度递归算法源码

》数据结构:

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,  比较步骤95,二者同样为2,故步骤4的返回值为2+1,为3

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 红米2屏幕失灵怎么办 红米手机电池不耐用怎么办 红米手机没内存怎么办 红米2a卡顿怎么办 红米2a手机卡顿怎么办 红米5a内存不足怎么办 红米note1s内存不够怎么办 红米2手机没内存怎么办 红米note显示无服务怎么办 红米手机死屏了怎么办 红米4a信号不好怎么办 小米2a开不了机怎么办 红米4x屏幕失灵怎么办 红米4x外屏坏了怎么办 honor手机开不了机怎么办 honor黑屏开不了机怎么办 红米2开机停在mi怎么办 红米手机无法开机怎么办 小米手机帐号密码忘了怎么办 小米手机忘记小米账号密码怎么办 小米4账号密码忘了怎么办 小米2a触屏失灵怎么办 红米note5拍照不清晰怎么办 红米手机太卡怎么办 红米3x忘记密码怎么办 红米手机太卡了怎么办 红米手机太卡怎么办? 红米3老是死机怎么办 红米3s经常死机怎么办 红米4a进水了怎么办 魅族耳机声音小怎么办 魅蓝note6声音小怎么办 魅蓝3s锁定怎么办 红米1密码忘了怎么办 小米手环升级失败怎么办 红米4忘记密码怎么办 红米1代忘记密码怎么办 红米3s忘记密码怎么办 小米3卡槽卡住了怎么办 红米4手机信号不好怎么办 红米note3信号差怎么办