《程序员面试金典》--平衡二叉树的检测
2015-10-06 11:25
351 查看
题目描述:
实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1。给定指向树根结点的指针TreeNode* root,请返回一个bool,代表这棵树是否平衡。
题目分析:
<方法1>:
平衡二叉树是通过左右子树的高度来判断是否为平衡二叉树的,所以我们首先想到的是如何求一个树的高度,求一个树的高度很简单,递归求解,每次求出左右子树的最大高度再加1便是父节点的高度,这样递归下去,便可以求出任何一颗树的高度。
既然可以求出任何一个节点的高度,那么通过再次遍历二叉树,判断任何一个节点的左右子树高度相差是否满足平衡二叉树便可实现平衡二叉树的判断。
求一颗平衡树高度的时间复杂度为O(logN),那么在第二次遍历的时候需要求每个节点的高度时间复杂度为O(NlogN)。其实这个过程大部分都是重复判断的,下面的方法是该方法的浓缩。
<方法2>:
在一次遍历的过程中,既求一个节点的高度,同时该节点是否满足平衡条件,递归函数中一个引用参数返回子节点的高度,然后父节点的高度便可以通过两个子节点的高度求出来,首先判断两个子节点的高度是否满足平衡二叉树,不满足直接返回,满足的情况下,求出当前节点的高度,继续向上递归。
该方法的时间复杂度只有O(logN)
代码实现如下:
实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1。给定指向树根结点的指针TreeNode* root,请返回一个bool,代表这棵树是否平衡。
题目分析:
<方法1>:
平衡二叉树是通过左右子树的高度来判断是否为平衡二叉树的,所以我们首先想到的是如何求一个树的高度,求一个树的高度很简单,递归求解,每次求出左右子树的最大高度再加1便是父节点的高度,这样递归下去,便可以求出任何一颗树的高度。
既然可以求出任何一个节点的高度,那么通过再次遍历二叉树,判断任何一个节点的左右子树高度相差是否满足平衡二叉树便可实现平衡二叉树的判断。
求一颗平衡树高度的时间复杂度为O(logN),那么在第二次遍历的时候需要求每个节点的高度时间复杂度为O(NlogN)。其实这个过程大部分都是重复判断的,下面的方法是该方法的浓缩。
<方法2>:
在一次遍历的过程中,既求一个节点的高度,同时该节点是否满足平衡条件,递归函数中一个引用参数返回子节点的高度,然后父节点的高度便可以通过两个子节点的高度求出来,首先判断两个子节点的高度是否满足平衡二叉树,不满足直接返回,满足的情况下,求出当前节点的高度,继续向上递归。
该方法的时间复杂度只有O(logN)
代码实现如下:
#include<iostream> using namespace std; struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; class Balance { public: bool isBalance(TreeNode* root) { // write code here int high=0; return isBalance1(root,high); } bool isBalance1(TreeNode* root,int &high) { if(root==NULL) { high=0; return true; } int lhigh,rhigh; if(!isBalance1(root->left,lhigh)||!isBalance1(root->right,rhigh)) return false; if(lhigh-rhigh>1||lhigh-rhigh<-1) return false; high=(lhigh>=rhigh?lhigh:rhigh)+1; return true; } };
相关文章推荐
- iOS-面试助攻(二)
- 黑马程序员_JAVA单例设计模式
- 关于程序员的笑话
- 黑马程序员——基础知识——数组
- Java程序员常犯的10个错误
- PHP面试体小总结
- 黑马程序员-java基础(三)-异常体系
- 黑马程序员——IO概述之字符流
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 黑马程序员—IO流(2)
- 作为程序员,要取得非凡成就需要记住的15件事。
- Android面试准备:自定义控件(二)
- 如何在面试中面试官的提示下,积极地思考?
- 黑马程序员——String类及相关类
- 国外程序员推荐:每个程序员都应读的书
- 2015笔试面试经验——java基础
- iOS-面试助攻(二)
- 黑马程序员_Java其他对象(System,Runtime,Date,Calendar,Marh-Random)
- 黑马程序员—集合