剑指offer系列43---判断平衡二叉树

【题目】判断一颗二叉树是不是平衡二叉树。
* 平衡二叉树定义:任意子节点深度相差不超过1.
【思路】由上题,利用递归得到二叉树每个结点的深度同时比较。

 1 package com.exe9.offer;
 2
 3 import com.exe9.offer.BTreeDepth.TreeNode;
 4
 5 /**
 6  * 【题目】判断一颗二叉树是不是平衡二叉树。
 7  *           平衡二叉树定义:任意子节点深度相差不超过1.
 8  * 【思路】由上题,利用递归得到二叉树每个结点的深度同时比较。
 9  * @author WGS
10  *
11  */
12 public class IsAVL {
13
14     static class TreeNode{
15         int val;
16         TreeNode left=null;
17         TreeNode right=null;
18         public TreeNode(int val){
19             this.val=val;
20         }
21     }
22     //得到树的深度
23     public int getBTreeDepth(TreeNode pRoot){
24         if(pRoot==null) return 0;
25         //每当proot==null时,就比较left与right大小,加1
26         int left=getBTreeDepth(pRoot.left);
27         int right=getBTreeDepth(pRoot.right);
28         //System.out.println(left+"===="+right);
29         return (left>right)?left+1:right+1;
30
31     }
32     public boolean isAVL(TreeNode pRoot){
33         if(pRoot==null) return true;
34         int left=getBTreeDepth(pRoot.left);
35         int right=getBTreeDepth(pRoot.right);
36         int val=left-right;
37         if(val>1 || val<-1)
38             return false;
39
40         return isAVL(pRoot.left) && isAVL(pRoot.right);
41     }
42     public static void main(String[] args) {
43         TreeNode root = new TreeNode(1);
44         TreeNode node1 = new TreeNode(2);
45         TreeNode node2 = new TreeNode(3);
46         TreeNode node3 = new TreeNode(4);
47         TreeNode node4 = new TreeNode(5);
48         TreeNode node5 = new TreeNode(6);
49         TreeNode node6 = new TreeNode(7);
50
51         root.left = node1;
52         root.right = node2;
53         node1.left = node3;
54         node1.right = node4;
55         node2.right = node5;
56         node4.left = node6;
57
58         boolean b=new IsAVL().isAVL(root);
59         System.out.println(b);
60
61     }
62
63 }
时间: 2024-12-14 05:26:31

剑指offer系列43---判断平衡二叉树的相关文章

剑指Offer系列之题11~题15

目录 11.矩形覆盖 12.二进制中1的个数 13. 数值的整数次方 14.调整数组顺序使奇数位于偶数前面 15.链表中倒数第k个结点 11.矩形覆盖 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 斐波那契数列的应用 第一次竖着放一块类比为走一步,第一次横着放两块类比为走两步 代码与上面的斐波那契数列类题目类似,此处不再赘述:剑指Offer系列之题6~题10. 12.

剑指offer系列10:合并两个排序的链表

我拿到这个题的时候举的例子是链表1:1.3.5.7和链表2:2.4.6.8.我的思路是以:1为基础,将表2的每个结点插入表1.也就是说我一次性是要给新建立的链表中加入两个元素,分别是两个原始链表的头结点.这个思路我做了半天头脑一片混乱,中间指针实在不知道怎么弄了.于是我去睡了一觉,哈哈,我大概是这个世界上最会逃避的人了…… 看了答案使用了递归的方法,其实我做的时候我有想到要用递归,但是没用的原因是我一般写代码不喜欢用递归,原因有两个,一个是递归容易死循环,一个是递归的复杂度太高.但这道题真的太适

剑指offer系列47:堆成的二叉树

这个题的主要思路是: 用二叉树的左子树的右子树和右子树的左子树比较,再用左子树的左子树和右子树的右子树比较.(好像有点绕,但其实就是堆成的思想) 剑指offer的说法是用数的前序遍历的两个方法,前序遍历应该是:根->左->右.但是我们用另一种前序遍历:根->右->左.如果这两个序列一样就判断它是对称的. 这两个方法在实现上其实是一样的. 1 class Solution { 2 public: 3 bool isSymmetrical(TreeNode* pRoot) 4 { 5

剑指offer系列4:斐波那契数列

剑指offer第九题,这个题很古老了.第一个想到的肯定是递归,很简单. 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 class Solution { 5 public: 6 int Fibonacci(int n) { 7 if (n == 0) 8 { 9 return 0; 10 } 11 if (n==1||n==2) 12 { 13 return 1; 14 } 15 else 16 {

剑指offer系列——48.不用加减乘除做加法

Q:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. T: 1.使用进制. 两个数异或:相当于每一位相加,而不考虑进位: 两个数相与,并左移一位:相当于求得进位: 将上述两步的结果相加 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2. 第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果. 第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12. 同样我们可以用三步走的方

《剑指offer》:[39-1]判断是否为平衡二叉树

题目:输入一棵二叉树的结点,判断该树是不是平衡二叉树.如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 上图中的二叉树就是一棵平衡二叉树. 分析:有了求二叉树深度的思路后,我们很快就能找到求解该问题的方法,就是从根结点开始开始判断其左右子结点的深度之差是否为1.如果从根结点开始到叶子结点的每一个结点的左右子树的深度相差都不超过1,则说明该二叉树是平衡二叉树.但是其时间复杂度接近O(N*N),因为里面有重复的遍历和访问.例如我们在判断8这个根结点是否是平衡的时候,我们

剑指offer系列32-----对称二叉树的判断

[题目]请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 1 package com.exe7.offer; 2 3 /** 4 * [题目]请实现一个函数,用来判断一颗二叉树是不是对称的. 5 * 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 6 * @author WGS 7 * 8 */ 9 public class SymmetricalTreeNode { 10 public class TreeNode{

剑指offer系列27--表示数值的字符串

[题目]请实现一个函数用来判断字符串是否表示数值(包括整数和小数). 例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值. 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是. 1 package com.exe6.offer; 2 /**[题目] 3 * 请实现一个函数用来判断字符串是否表示数值(包括整数和小数). 4 * 例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表

剑指offer系列31-----二叉树的下一个节点

[题目]给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回. 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 1 package com.exe7.offer; 2 3 /** 4 * [题目]给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回. 5 * 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 6 * @author WGS 7 * 8 */ 9 public class GetNextNode { 10 11 pu