剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)
题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
一 . 题目分析
首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树。如下图:

所以,知道了这个概念之后,回归题目。判断该二叉树是不是平衡二叉树,就要在二叉树每个节点的深度来搞了,肯定要对二叉树进行遍历,但是如何效率最大化,如果从小往上遍历,一次遍历是否可以完成任务,而从下往上的遍历又让我想到了二叉树唯一的一种自下而上的遍历方法(我说的仅是前后根三种之中而已)。
解决方案与关键词:
1 . 二叉树自下而上遍历一次:后序遍历,左右根
2 . 二叉树平衡判断条件:每个根节点深度绝对值小于等于1
3 . 二叉树每个根节点的深度累加:递归实现
二 . 代码实现
class Solution
{
public bool IsBalanced_Solution(TreeNode pRoot)
{
// write code here
// 若为空树,返回正确
if (pRoot == null)
return true;
// 递归函数
getNextDepth(pRoot);
// 最终结果
return valid;
}
// 定义一个初始值假设该树是平衡二叉树
bool valid = true;
private int getNextDepth(TreeNode node)
{
// 若为空树,判断深度
if (node == null)
{
return ;
}
else
{
// 左右递归
int left = getNextDepth(node.left);
int right = getNextDepth(node.right);
// 平衡二叉树的判断条件(左右节点差小于等于1)
if ((left - right) > || (right - left) > )
{
valid = false;
}
// 二叉树深度累加方法,目的用于上一段代码进行深度判断
int res = + System.Math.Max(left, right);
return res;
}
}
}
三 . 用通俗的语言进行代码详解
依旧用举例的方法进行,如下图:

剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)的更多相关文章
- 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列
剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...
- 剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)
问题描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 思路: 1.首先后序遍历的结果是[(左子 ...
- 剑指offer(23)二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 题目分析 1.后续遍历我们可以知道,最右边的是根节 ...
- 【剑指Offer】23、二叉搜索树的后序遍历序列
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路: 对于后续遍历序列,序 ...
- 剑指Offer的学习笔记(C#篇)-- 序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...
- 剑指Offer的学习笔记(C#篇)-- 反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头. 一 . 概念普及 关于线性表等相关概念请点击这里. 二 . 实现方法 目前,可以有两种方法实现该要求. 方法一:借助外部空间实现.这里可以将单链 ...
- 剑指Offer的学习笔记(C#篇)-- 链表中倒数第K个点
题目描述 输入一个链表,输出该链表中倒数第k个结点. 一 . 数据结构基础概念普及(线性表). 线性表可分为顺序表与链表,它们是堆栈.队列.树.图等数据结构的实现基础. 顺序表,线性表的顺序存储结构是 ...
- 剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...
- 剑指Offer的学习笔记(C#篇)-- 和为S的连续正数序列
题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...
随机推荐
- 【Leetcode-easy】Remove Duplicates from Sorted Array
题目要求:删除排好序的含有重复元素的数组.返回去除重复后的数组长度,并更新原始数组.不能使用额外空间. 思路:要不额外的使用内存空间,那么只有遍历数组,count保持下一个不重复的数字,遍历过程中如果 ...
- centos7 永久修改主机名
hostnamectl set-hostname xxx 一劳永逸,永绝后患
- 大数据- 自定义Log4j日记
1.新建一个java project,在src下新建一个lib文件夹和 rescources 文件夹,resources文件夹不能命名错误. 点击File——>project Structure ...
- 在eclipse配置Maven
一.配置系统Maven环境变量 1. 前往https://maven.apache.org/download.cgi下载最新版的Maven程序: 2. 新建环境变量MAVEN_HOME,赋值D: ...
- java中路径的获取
网上摘录 (1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getReque ...
- numpy中的tile函数
tile()函数可以很方便的生成多维数组.它有两个参数,第一个数是原始数组;第二个表示如何来生成,第一个数字表示生成几行,第二个表示每行有多少个原始数组(如果只写一个数字,那么就默认是一行). fro ...
- javascript基础知识整理(不定时更新)
1.js中真与假的定义: 真:true,非零数字,非空字符串,非空对象 假:false,数字零,空字符串,空对象(null),undefined 2.使用for循环对json进行循环操作 for(va ...
- ACM学习历程——HDU4814 Golden Radio Base(数学递推) (12年成都区域赛)
Description Golden ratio base (GRB) is a non-integer positional numeral system that uses the golden ...
- python后台架构Django教程——manage.py命令
一.manage.py命令选项 manage.py是每个Django项目中自动生成的一个用于管理项目的脚本文件,需要通过python命令执行.manage.py接受的是Django提供的内置命令. 内 ...
- 2011年浙大:Twin Prime Conjecture
Twin Prime Conjecture Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...