首页 > 其他分享 >递归与非递归求树的高度

递归与非递归求树的高度

时间:2022-10-11 17:14:34浏览次数:50  
标签:结点 last 指向 递归 求树 与非 front rear

递归实现

代码思路:检查结点的左右子树,让高度较大的子树加上1即为树的高度,然后递归的重复此过程

int Btdepth(BiTree T){
    if(T==NULL)                      //递归的出口
        return 0;
    ldep=Btdepth(T->lchild);         //左子树的高度
    rdep=Btdepth(T->rchild);         //右子树的高度
    if(ldep>rdep)                    //返回较大子树的高度加上1
        return ldep+1;
    else
        return rdep+1;
}

非递归实现

代码思路:层序遍历二叉树,若遍历完一层的最后一个结点时让记录的高度加1

  1. 用层序遍历二叉树,需要用到队列,并用frontrear来表示当前队列中的情况
    (注意front和rear初始为-1,因为需要判定front==last时到达此层最后一个结点)
  2. 用一个last指针指向每层的最后一个结点,初始时指向根节点last=0,即队中Q[0]的位置
  3. level来记录当前树的高度
int Btdepth(BiTree T){
    if(T==NULL)
        return 0;           //如果为空树返回高度0
    int front=-1,rear=-1;   //初始化队列中的参数
    int level=0,last=0;     //初始化树都高度和last标记
    BiTree Q[Maxsize];      //设置队列,因为要存放的元素是树的结点所以用BiTree来定义
    Q[++rear]=T;            //先让根节点入队
    BiTree p;               //用一个p指针来遍历二叉树
    while(front<rear){      //当队不空时循环
        p=Q[++front];                  //出队
        if(p->lchild)                  //若有左孩子则左孩子入队
            Q[++rear]=p->lchild;
        if(p->rchild)                  //若有右孩子则右孩子入队
            Q[++rear]=p->rchild;
        if(front==last){               //若此次出队的结点是此层最后一个结点
            level++;                   //树的高度加1
            last=rear;                 //让last指向下一层的最后一个结点
        }
    } 
    return level;
}

小疑问

Q:为什么last每次都能指向每层的最后一个结点呢φ(゜▽゜*)♪?

A:我们不妨来模拟一下,每次front移动的时候都会让rear指向它最后一个孩子(从左向右数),当front第一次等于last的时候,rear指向第二层的最后一个,当front第二次等于last的时候,rear指向第三层的最后一个结点,以此类推每次front指向上一层的最后一个结点的时候rear就指向下一层的最后一个结点啦Ψ( ̄∀ ̄)Ψ,此时只要让last等于rear就能更新每层最后一个结点。

求树高

(注意front和rear本身直接表示的是队列中对头与队尾的元素,但是我们可以把它映射为二叉树中结点的位置)

标签:结点,last,指向,递归,求树,与非,front,rear
From: https://www.cnblogs.com/Auous/p/16779799.html

相关文章

  • 第二十一章 函数递归
    一、函数递归调用介绍函数不仅可以嵌套定义,还可以嵌套调用,即在调用一个函数的过程中,函数内部又调用另一个函数,而函数的递归调用指的是在调用一个函数的过程中又直接或间接......
  • 表达式语法分析——递归子程序法
    Description递归子程序法是一种确定的自顶向下语法分析方法,要求文法是LL(1)文法。它的实现思想是对应文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符......
  • mysql树型结构查询父类函数,mysql递归查询父类函数
     ================================©Copyright蕃薯耀 2022-10-10https://www.cnblogs.com/fanshuyao/ 一、MySQL中创建函数时出现错误的解决方法此步可跳过不......
  • ElementUI采用递归方式使用导航菜单(NavMenu)报错
    在使用element-ui的导航菜单时,由于可能存在无数个子菜单需采用递归方式生成,在组件中重复调用本组件但会导致鼠标移入时循环调用element内部的某个鼠标事件,引起下拉菜单报......
  • fibnacci数列递归实现
    1.网上查询资料说明什么是fibnacci数列?斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故又称为......
  • fibnacci数列递归实现
    网上查询资料说明什么是fibnacci数列?斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89...,这个数列从第3项开始,每一项都等于前两项之和。其通项公式为:给出fibnacci数......
  • 递归
    递归递归概念递归就是方法自己去调用自己本身,每次调用时传入的参数不同;递归有助于解决复杂问题,并且简化代码。递归解决的问题可以解决各种数学问题,汉诺塔、迷宫、8......
  • Go中的闭包、递归
    一闭包详解闭包的应该都听过,但到底什么是闭包呢?闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。“官方”的解释是:所谓“闭包”,指的是一个拥有许......
  • 【Java复健指南03】递归思想
    【递归】递归重要规则1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间)方法的局部变量是独立的,不会相互影响,比如n变量如果方法中使用的是引用类型变量(比......
  • python递归算法
    递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调自己”,一个使用递归技术的方法将会直接或间接的调用自己。利用递归可以用简单的程序来解决......