精华内容
下载资源
问答
  • #数据结构 二叉树递归算法返回二叉树高度

    #数据结构 二叉树递归算法返回二叉树高度
    在这里插入图片描述

    展开全文
  • 二叉树递归算法

    2011-11-18 12:36:32
    自己写的一个二叉树的基本操作程序,涉及各种遍历算法
  • 给定一个二叉树,对于这个二叉树结点的值,同一个边上的值不能同时选取(即两个结点的关系为双亲和孩子的关系, 则两个结点在同一个边上, 那么这两个结点至多只能选取一个),将选取的结点的值相加, 求这个二叉树所能选...
  • 先序遍历二叉树递归算法怎样理解

    先序遍历二叉树的递归算法怎样理解

    先序遍历二叉树的递归算法怎样理解  


    二叉树的结点结构是: 
    1、根结点(存放结点数据) 
    2、左子树指针 
    3、右子树指计 
    对二叉树的遍历就是访问各个结点中根结点里存放的数据。例如: 
        如果结点A有左结点B,右结点C,记作A(B,C),不同结点我用"\"隔开。那么有这样一个(BitTree)二叉树表A(B,C) \B(D,E)\E(F.G)\C(空,H)\H(I.空), 自己画出来,不然我后面白讲了。 
     

        要想把所有的数据都访问到则必需按照一定的原则,即当前结点的下一个结点是哪个结点。 
           无论是先、中还是后序算法都是先将左结点视为下一个结点,当左结点不存在(即为空时)才将右结点视作下一个结点,如果右结点也不存在就返回当前结点的上层结点再向右访问,如此类推。 
       于是对二叉树的遍历问题就被抽象成三个基本步骤: 
    1、访问根结点。 
    2、访问该点的所有左子树。 
    3、访问该点的所有右子树。 
       先序遍历的策略是按123的步骤执行,中序是按213来,后序则是231,它们之间的不同只是“访问根结点”在这三个步骤中的位置。 
       看着你刚画好的那个BitTree跟着我的思路走。在先序遍历算法PriorOrder中,先将BitTree的头结点A传进来,按步骤123的处理。123是抽象实现,记住所表达的思想,下面是具体实现。为了避免混乱用中文数字记录步骤。 
    一、即是读取结点A的数据内容A(此时A为当前函数处理结点),将A的右结点C放入栈S中,S中的内容为S(C)[注意这一步是算法的一个辅助,并不是先向右访问,下同],将左结点B传给PriorOrder处理。此时读取了A 
    二、读取B的内容B(此时B为当前结点),将B的右结点E放入S中,S中的内容为S(C,E),将B的左结点D传给PriorOrder处理。此时读取了AB 
    三、D为当前结点,D的右为空没有东西放入S,S中的内容仍为S(C,E),D的左也为空,没有访问可访问的。此时就从S中取出E(因为栈是先进后出的所以取的就是E,此时S中的内容为S(C),正好是上一层没访问过的右子树),将E传给PriorOrder处理。此时读取了AB D 
    四、E为当前结点,对于结点E类似的有S(C,G),读取了ABDE,将F传入PriorOrder 
    五、F为当前结点,右为空,左也为空,读取了ABDEF,从栈中取出G传给PriorOrder处理,S的内容为S(C); 
    六、类似的读取了ABDEFG,从S中取出了C,传给PriorOrder处理。此时S()。 
    七、当前结点为C,从将C的右结点放入S,S中内容为S(H),C的左为空,从S取出H,将H传给PriorOrder处理。此时S为S().于是就读取了ABDEFGC 
    八,类似的读取了ABDEFGCH 
    九,最后ABDEFGCHF 
       你再对照的书上的算法想想,画画就应该能明白点。特别要理角的一点是为什么用递归算法时计算机能按这样的方式是因为函数调用是“先调用,后执行完”,或者说“后调用,先执行完”。注意我加一个“完”字 
    展开全文
  • 二叉树的结构: typedef struct BTNode { ElemType data; struct BTNode *lchild, *rchild...这个递归算法二叉树的深度其实和遍历二叉树的后序遍历算法差不多。 int BTNodeDepth(BTNode *b) { int lchildD...

    二叉树的结构:

    typedef struct BTNode 
    {
        ElemType data;
        struct BTNode *lchild, *rchild;
    } BTNode;
    

    递归算法求二叉树的深度depth:

    这个递归算法求二叉树的深度其实和遍历二叉树的后序遍历算法差不多。

    int BTNodeDepth(BTNode *b)
    {
        int lchildDepth, rchildDepth;
        if (b == NULL) return 0;
        else {
            lchildDepth = BTNodeDepth(b->lchild);//求左子树的高度为lchildDepth
            rchildDepth = BTNodeDepth(b->rchild);//求右子树的高度为rchildDepth
            return (lchildDepht > rchildDepth) ? (lchildDepth + 1) : (rchildDepth + 1);//取大者
        }
    }

    非递归算法求二叉树的深度:

    其实非递归算法求二叉树的深度就是使用二叉树的层次遍历的算法。

    int BTNodeDepth(BTNode *b)
    {
        BTNode *p = NULL, queue[MaxSize];
        int front, rear;
        front = rear = -1;
        int level = 1;
        int last = front;
        while (front != rear) 
        {
            p = queue[++front];
            if (l->lchild)
                queue[rear++] = p->lchild;
            if (l->rchild)
                queue[rear++] = p->rchild;
            if (last == front) 
            {
                level++;
                last = rear;
            }
        }
        return level;
    }

     

    展开全文
  • 二叉树递归算法:建立二叉树、遍历二叉树.doc 多多指教
  • 数据结构 二叉树递归算法
  • 二叉树高度的递归算法中递归过程理解

    千次阅读 多人点赞 2019-07-04 12:08:16
    所以,递归,也是一种 典型的 用空间换时间 的算法。   5.如果root是空就返回0,如果非空就遍历子树。取最高子树,然后加1就得到了整棵树的高度。就这样递归下去的 6. 左子树的高度height(llink)...
    int GetHeight(AVLTree A)
    {
        int MaxH, HR, HL;
        if(A) {
            HL = GetHeight(A->Left);
            HR = GetHeight(A->Right);
            MaxH = (HL>HR)?HL:HR;
            return MaxH+1;
        }
        return 0;
    }

    1.递归函数关注以下几个因素
    ·退出条件
    ·参数有哪些
    ·返回值是什么
    ·局部变量有哪些
    ·全局变量有哪些
    ·何时输出
    ·会不会导致堆栈溢出

    2.

     

    3.理解递归的时候不能一直往深处考虑,那样不适合人类的思维,只需要思考最后该退出时要返回什么,一般的情况下该返回什么,写代码时明确了这两个即可

    4.

    int Hight(Node* root)
        {
            if ( !root )
                return 0;
            else
                return max(Hight(root->left_child),Hight (root->right_child)) + 1
        }

    !root , 也就是指针为空的时候返回 0;
    就是说,遇到空节点,返回 0 ;

    下一行: return max()+ 1 ;
    这个是关键点,返回每一个子节点的高度,
    括号内,是调用自身这个函数(返回节点树高度)

    整个函数的思想可以看做是分治:即把大问题分解成小问题,对于整体函数,不需要知道每一步的执行过程,只需要知道上一步的结果就可以。

    每个函数调用自身,判断出是否需要继续调用函数,还是直接返回最根部的值 0 。如果调用函数,即需要获取调用函数的返回值即可。

    如果想理解这个函数,提供一个逆向的思维方式,从叶子结点开始思考,也就是  !root 那一行,返回了 0 ,调用他的函数 作对比,取最高值(深度最深值),依次递增到根节点或所输最外层节点,最终返回最大深度。

    实现性原理:
    每次递归调用一次函数时,计算机都会新开辟出一段函数空间、存储空间,为当前新调用的函数提供存在的空间。  以这个函数的运行为例,系统最终会开辟一个类似树形连接的区域,然后再依次确定每个函数的返回值(从叶子结点开始)。

    所以,递归,也是一种 典型的 用空间换时间 的算法。

     

    5.如果root是空就返回0,如果非空就遍历子树。取最高子树,然后加1就得到了整棵树的高度。就这样递归下去的

    6.

    
    左子树的高度height(llink) 
    右子树的高度height(rlink) 
    这两个高度当然要取更大的数 对吧 
    加上自己的节点 1: 
          本次递归的p------> O(p) 
                          /  \ 
                         /    \ 
    height(llink)------>左子树  右子树 <----------height(rlink) 
    总的高度 为 1 + max(height(llink),height(rlink)); 
    

    7.

    
    public int height(BinaryTreeNode p) {  //p是一个二叉树根节点的引用
        if(p == null){
           System.out.println("高度为0")
           return 0;
         }else{
           return 1 + max(height(llink),height(rlink));  //这个LLINK 和RLINK分别是p的两个指针,指向左子树和右子树
         }
    }

    你可以这样理解:
    首先你就当height可以求出某个节点的高度
    从根节点开始,怎么表示这棵树的高度?根节点一层,左右子树,谁层数多,当然加上谁的啦
    所以 return 1 + max(height(llink),height(rlink));
    然后对llink或者rlink都是同样的理解
    最后什么时候返回?当然是节点为空的时候啦,因为一个叶子节点已经是最后一层,它的左右节点
    都是空的。

    展开全文
  • 3.使用递归 先序遍历一棵二叉树 4.使用递归 中序遍历一棵二叉树 5.使用递归 后序遍历一棵二叉树 6.使用非递归 先序遍历一棵二叉树 7.使用非递归 中序遍历一棵二叉树 8.使用非递归 后序遍历一棵二叉树 PS:代码为C++...
  • 用C++实现的二叉树递归遍历算法
  • 二叉树递归算法例题

    多人点赞 2019-03-25 23:05:42
    二叉树递归算法: 1. 统计二叉树中,度为0的结点个数 2. 统计二叉树中,度为1的结点个数 3. 统计二叉树中,度为2的结点个数 4. 统计二叉树高度 5. 统计二叉树宽度度 6. 删除二叉树中所有叶子节点 7. 交换每个...
  • 二叉树递归算法:建立二叉树、遍历二叉树
  • 遍历二叉树递归算法与非递归算法 先来看下面这棵二叉树。如图1。现在我们要对它进行先序遍历。递归思想:就是把这个大树拆分成N棵小树,每棵小树都进行一次先序遍历。再把这些遍历连合起来就是这棵树的先序遍历了...
  • 二叉树的存储结构有顺序存储和链式存储两种存储方式,这里我们采用使用频率较高的链式存储方式(二叉链表)来存储二叉树. 下面给出二叉树结点的定义. struct BiTreeNode//二叉树结点定义 { BiTreeNode* LChild;//...
  • 这个需要自己慢慢体会zhi,其实所dao有递归算法实质上都是一样的,理解了就万变不离其宗了。 create(node *root) { root=new node; 写上关于root的信息//初始化root节点 if(root满足自定义的条件)//自定义一个...
  • 本文作者意在分析,递归算法二叉树遍历中的执行过程,主要分析多重递归算法是如何一步步调用自身(保存现场)和调用返回(恢复现场)。 在分析过程中,借用了设置断点,查看堆栈窗口中入栈和出栈情况。并绘制了两...
  • 小小学习,C语言数据结构,中序遍历二叉树递归算法
  • 齐鲁工业大学实验报告 成绩 课程名称 数据结构 指导教师 单健芳 实验日期 院系 信息学院 专业班级 计科嵌入14-1 实验地点 学生姓名 高晨悦 学号 2 同组人 无 实验项目名称 二叉树递归算法 一实验目的和要求 1....
  • 齐鲁工业大学实验报告 成绩 课程名称 数据结构 指导教师 单健芳 实验日期 院系 信息学院 专业班级 计科嵌入 14-1 实验地点 学生姓名 高晨悦 学号 2 同组人 无 实验项目名称 二叉树递归算法 一实验目的和要求 1....
  • 后序遍历二叉树递归算法的推导及形式化证明,难得的期刊论文资料,对研究二叉树的非递归性遍历有很大帮助
  • 二叉树递归与非递归遍历
  • 设一棵二叉树以二叉链表表示,试编写有关二叉树递归算法
  • 二叉树递归算法

    千次阅读 2018-05-04 17:18:49
    //非递归二叉树借用栈 //使用链栈, //使用它的原因:1.需要使用先进后出的存储结构;2.需要存储数据个数不定; //三种遍历存储的虽然都是相同的数据类型,但是使用的目的不一样,所以使用的位置不一样 //先序遍历:...
  • 编写复制一棵二叉树的非递归算法编写复制一棵二叉树的非递归算法编写复制一棵二叉树的非递归算法编写复制一棵二叉树的非递归算法编写复制一棵二叉树的非递归算法编写复制一棵二叉树的非递归算法编写复制一棵二叉树的...
  • 中序遍历递归算法在VC6.0环境下运行成功!
  • 齐鲁工业大学实验报告 成绩 课程名称 数据结构 指导教师 单健芳 实验日期 院系 信息学院 专业班级 计科嵌入 14-1 实验地点 学生姓名 高晨悦 学号 2 同组人 无 实验项目名称 二叉树递归算法 一实验目的和要求 1....
  • v1.0 可编辑可修改 齐鲁工业大学实验报告 成绩 课程名称 数据结构 指导教师 单健芳 实验日期 院系 信息学院 专业班级 计科嵌入 14-1 实验地点 学生姓名 高晨悦 学号 1007 同组人 无 实验项目名称 二叉树递归算法 ...
  • v1.0 可编辑可修改 齐鲁工业大学实验报告 成绩 课程名称 数据结构 指导教师 单健芳 实验日期 院系 信息学院 专业班级 计科嵌入 14-1 实验地点 学生姓名 高晨悦 学号 1007 同组人 无 实验项目名称 二叉树递归算法 ...
  • 二叉树的遍历算法有多种,典型的...而且这些遍历的递归算法较为简单,代码很少,容易实现,本文就是汇总二叉树遍历的递归算法,非递归算法将在下一篇文章中进行总结。本文中用到的二叉树实例如下: 3 /

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 103,076
精华内容 41,230
关键字:

二叉树递归算法理解