56. 2种方法判断二叉树是不是平衡二叉树[is balanced tree]

【本文链接】

http://www.cnblogs.com/hellogiser/p/is-balanced-tree.html

题目】

输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下图中的二叉树就是一棵平衡二叉树:

分析

之前的博文27.二元树的深度[BinaryTreeDepth]中介绍过如何求二叉树的深度。有了经验之后再解决这个问题,我们很容易就能想到思路。

【方案1】

先判断左右子树是不是平衡的,若平衡再求出左右子树的深度,若深度之差大于1,则不平衡。因为在遍历每个结点时都要求其左右子树的深度,因此时间复杂度是O(n^2)的

【代码】

C++
Code






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

 

#include "stdafx.h"

#include <cmath>

#include <algorithm>


/*

     version: 1.0

     author: hellogiser

     blog: http://www.cnblogs.com/hellogiser

     date: 2014/5/25
*/


// binary tree node struct

struct BinaryTreeNode

{
    int value;

     BinaryTreeNode *left;

     BinaryTreeNode *right;
};

// Get depth of a binary tree

int TreeDepth(BinaryTreeNode *root)

{
    // the depth of a empty tree is 0

    if(NULL == root)

        return 0;

    // the depth of left sub-tree

    int nLeft = TreeDepth(root->left);

    // the depth of right sub-tree
    int nRight = TreeDepth(root->right);


    // depth is the binary tree

    return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
    // return max(nLeft,nRight)+1;

}

// is balanced tree in O(n^2)

bool IsBalanced(BinaryTreeNode *root)

{
    if(NULL == root)

        return true;
    if(!IsBalanced(root->left))

        return false;
    if(!IsBalanced(root->right))

        return false;
    int leftDepth = TreeDepth(root->left);

    int rightDepth = TreeDepth(root->right);

    if (abs(leftDepth - rightDepth) > 1)

        return false;
    else

        return true;
}

【方2

在判断左右子树是否平衡的过程中把深度计算出来,这样在对父结点进行平衡判断时就可以不用再重复计算左右子树的深度了。其时间复杂度为O(n)

【代码】

C++
Code






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

 

// is balanced tree in O(n)

bool IsBalanced(BinaryTreeNode *root, int &depth)

{
    if(NULL == root)

     {

         depth = 0;

        return true;
     }

    int leftDepth, rightDepth;

    if(!IsBalanced(root->left, leftDepth))

        return false;
    if(!IsBalanced(root->right, rightDepth))

        return false;

    // get root depth without visiting left and right sub-trees

    depth = (leftDepth > rightDepth) ? (leftDepth + 1) : (rightDepth + 1);
    if (abs(leftDepth - rightDepth) > 1)

        return false;
    else

        return true;
}

// is balanced tree

bool IsBalancedTree(BinaryTreeNode *root)

{
    int depth;

    return IsBalanced(root, depth);

}

【参考】

http://zhedahht.blog.163.com/blog/static/25411174201142733927831/

http://blog.csdn.net/zjull/article/details/11646591

http://blog.csdn.net/luckyxiaoqiang/article/details/7518888

【本文链接】

http://www.cnblogs.com/hellogiser/p/is-balanced-tree.html

56. 2种方法判断二叉树是不是平衡二叉树[is balanced tree],布布扣,bubuko.com

时间: 2024-10-05 06:05:30

56. 2种方法判断二叉树是不是平衡二叉树[is balanced tree]的相关文章

判断二叉树是否平衡二叉树

题目 平衡二叉树的性质为:要么是一颗空树,要么任何一个节点的左右子树高度差的绝对值不超过1.给定一棵二叉树的头结点head,判断这棵二叉树是否为平衡二叉树. 难度:?? 基础理解 以下是个人认为对概念叙述较为详细的参考链接: 对平衡二叉树的理解:判断二叉树是否为平衡二叉树 对先序.中序.后序遍历的理解:二叉树的实现及先序.中序.后序遍历 设计 概要设计 设计一个初始树节点模型 接收节点变量并判断是否为平衡二叉树的方法 如何判断是否为平衡二叉树 包含对左右各分支节点的计数器,并以此相减,是否满足绝

判断二叉树是不是平衡二叉树

题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树.某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵二叉树. 我们很容易就能想到一个代码简洁却性能不佳的思路:在遍历树的每个结点的时候,调用函数TreeDpth得到它的左右子树的深度.如果每个结点的左右子树的深度相差都不超过1,按照定义它就是一棵平衡的二又树. 较好的思路是:用后序遍历的方式遍历整棵二叉树.在遍历某结点的左右子结点之后,我们可以根据它的左右子结点的深度判断它是不是平衡的,并得到当前结点的深度.当最后遍历到树的根结点

几种方法判断平面点在三角形内

最近在做一个Unity实现的3D建模软件,其中需要在模型表面进行操作的时候,需要用到点和三角形位置关系的判定算法.由于一个模型往往是几千个三角片,所以这个判定算法必须高效,否则会影响最终程序的整体性能.这里记录一下一些算法,如有误请指出,谢谢! 首先假设点和三角形在同一平面内,如果不在同一平面,需要用其它方法先筛选. 常用的几种平面点-三角形位置关系判定方法有(以下算法执行必须先保证点和三角形位于同平面): 1.顺时针/逆时针判定法 该方法要求点的顺序是顺时针或逆时针的,如果是顺时针的点,沿着3

3种方法判断手机浏览器跳转WAP手机网站

随着移动设备的普及,企业的网络宣传已经不能局限在PC端,而需要同时在移动端有所建树.对于公司网站来说,以前都是做的PC端的,当然手机等移动端也可以访问,但是用户体验肯定不如完全适合的手机端来的方便.我们在给自己的网站做了WAP手机网站之后,如果有用户通过手机访问我们的企业顶级域名网站,那就判断跳转到专为的手机站点. 第一种:直接JS脚本 <script type="text/javascript"> try { var urlhash = window.location.h

初窥Python(四)——三种方法判断python变量类型

python 是动态语言,定义变量时不用指定变量类型,在代码执行过程中,会根据变量的值确定变量类型.python 中常用的变量类型有 int  float  long  bool  str  list  tuple set dict 等,常用的变量类型的有 types 库及内置的 type(object) 和 isinstance(object,class-or-type-or-tuple) 方法,下面分别来看一下如何通过这些方法进行变量类型的判断. 1.使用types库结合type(objec

两种方法判断一个字符串是否为另外一个字符串旋转之后的字符串。(C语言)

例如:给定s1 = AABCD和s2 = BCDAA,返回1给定s1 = abcd和s2 = ACBD,返回0. AABCD左旋一个字符得到ABCDAAABCD左旋两个字符得到BCDAA 第一种:通过其中一个字符串向左移动确定第二个字符串 #include<stdio.h> #include<string.h> void left_move(char *str, int k) { while (k != 0) { char *cur = str;//必须需要另一个指针存储首地址 c

C# winform三种方法判断文本框textBox内容是否为空

使用系统API函数,需要使用命名空间:System.Runtime.InteropServices: 1.if (textBoxPath.Text ==  String.Empty ) 2.if (textBoxPath.Text == "" ) 3.if (String.IsNullOrEmpty(textBoxPath.Text)) 原文地址:https://www.cnblogs.com/kelly1314/p/12155928.html

判断一棵二叉树是不是平衡二叉树

二叉树中任意左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 两种解法. 第一种:菜鸟的解法,出现重复遍历,时间复杂度高. 1 bool IsBalanced(BinaryTreeNode* root) 2 { 3 if (root == NULL) 4 { 5 return true ; 6 } 7 int left = TreeDepth(root->m_pLeft);//该函数实现见我上一篇博客"数的深度" 8 int right = TreeDepth(root-&

两种方法实现队满和队空的判断操作(循环队列)

本周的作业要求: 1.给出循环队列的存储结构定义. 2.完成循环队列的基本操作函数. 1)      初始化循环队列: 2)      建立循环队列: 3)      实现入队和出队操作: 4)     采用下面两种方法实现对满和队空的判断操作: 方法一:修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元(必做):   方法二:设置标志flag,当front==rear且flag=0时为队空,当front==rear且flag=1时为队满(必做): 3.编写主函数实现基本操作函数功能,