二叉树的深度(递归+非递归)
递归实现基本思想:
为了求得树的深度,可以先求左右子树的深度,取二者较大者加1即是树的深度,递归返回的条件是若节点为空,返回0
算法:
int FindTreeDeep(BinTree BT){int deep=0;if(BT){int lchilddeep=FindTreeDeep(BT->lchild);int rchilddeep=FindTreeDeep(BT->rchild);deep=lchilddeep>=rchilddeep?lchilddeep+1:rchilddeep+1;}return deep;}
非递归实现基本思想:
受后续遍历二叉树思想的启发,想到可以利用后续遍历的方法来求二叉树的深度,在每一次输出的地方替换成算栈S的大小,遍历结束后最大的栈S长度即是栈的深度。
算法的执行步骤如下:
(1)当树非空时,将指针p指向根节点,p为当前节点指针。
(2)将p压入栈S中,0压入栈tag中,并令p执行其左孩子。
(3)重复步骤(2),直到p为空。
(4)如果tag栈中的栈顶元素为1,跳至步骤(6)。从右子树返回
(5)如果tag栈中的栈顶元素为0,跳至步骤(7)。从左子树返回
(6)比较treedeep与栈的深度,取较大的赋给treedeep,对栈S和栈tag出栈操作,p指向NULL,并跳至步骤(8)。
(7)将p指向栈S栈顶元素的右孩子,弹出栈tag,并把1压入栈tag。(另外一种方法,直接修改栈tag栈顶的值为1也可以)
(8)循环(2)~(7),直到栈为空并且p为空
(9)返回treedeep,结束遍历
int TreeDeep(BinTree BT ){int treedeep=0;stack S;stack tag;BinTree p=BT;while(p!=NULL||!isEmpty(S)){while(p!=NULL){push(S,p);push(tag,0);p=p->lchild;}if(Top(tag)==1){deeptree=deeptree>S.length?deeptree:S.length;pop(S);pop(tag);p=NULL;}else{p=Top(S);p=p->rchild;pop(tag);push(tag,1);}}return deeptree;}
二叉树的深度(递归+非递归)相关推荐
- 【代码+注释】求二叉树的深度【超详细】递归+非递归实现
编写算法求出二叉树的深度(层数) 二叉树的深度是指从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.本文将用两种方式求出二叉树的深度 第一种:无可置疑是递归 核 ...
- 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++
a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...
- 实现二叉树的三种非递归遍历算法
[问题描述] 编写程序,实现二叉树的三种非递归遍历算法:先序非递归,中序非递归,后序非递归. [输入形式] 输入建树序列. [输出形式] 输出三种遍历序列. [样例输入] A B C # # # # ...
- java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...
import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...
- 二叉树(2)——遍历的非递归实现
2019独角兽企业重金招聘Python工程师标准>>> 算法概述 递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍 ...
- 二叉树打印叶子节点,非递归_使用递归打印链接列表中的备用节点
二叉树打印叶子节点,非递归 Solution: 解: Input: A singly linked list whose address of the first node is stored in ...
- java二叉树深度优先遍历会考不递归的吗_树的广度优先遍历和深度优先遍历(递归非递归、Java实现)...
在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程.现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的) 1.广度优先遍历 英文缩写为BFS即B ...
- 二叉树的遍历(非递归)整理
二叉树的遍历(非递归) 写在前面 二叉树重要,重要,重要.以下代码每日手撸一遍,深刻理解. 二叉树的先序遍历(非递归) 巧记心法 判断是否为空树 1.右侧入栈(访问,q指向右孩子,不空则入栈) 2.p ...
- 二叉树——中序遍历(递归/非递归)
中序遍历,即遍历顺序为:左节点.根节点.右节点. 二叉树节点: public class Node {public Node left;public Node right;public int val ...
- 二叉树的后序非递归遍历(巧妙思想)
大家都知道二叉树的前序非递归遍历非常好写: //二叉树的结构 public class TreeNode {TreeNode left;TreeNode right;int val;TreeNode( ...
最新文章
- jQuery 人脸识别插件,支持图片和视频
- python-argparse批量修改后缀名-batch_file_rename.py
- Cascade R-CNN升级!目标检测制霸COCO,实例分割超越Mask R-CNN
- C语言实现hello world代码
- python实现购物车总结_python3简单购物车实现
- Spark入门(Python版)
- MySQL二十四:索引
- JavaScript中 切割截取字符串的几种方法
- 手把手系列-从零开始手把手教你前后分离网站
- GY-BMP280-3.3 高精度大气压强传感器模块
- 一文详解结构光发展简史
- ubuntu 开机进不去桌面问题
- 淘宝618列车喵币自动做任务app 懒人一键安装包
- 抗癌药物之多肽药物偶联物技术(PDC)介绍
- Coursera 学习记录:细菌分组(通过冒泡排序实现两组有差异的分类)
- 牛客网刷算法题的输入输出(C++)
- 旧版微信内置浏览器x5核心无法打开,安装内核提示“内核下载失败115→115”,有相同情况吗
- java 使用*打印图形(菱形、平行四边形、三角形)
- 豆瓣上《特权和寻租的经济学》的书评
- Matlab如何提取论文插图中的渐变色?一招轻松搞定