推断二叉树是否平衡

题目:输入一棵二叉树的根结点,推断该树是不是平衡二叉树。假设某二叉树中随意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

注:这里不考虑该二叉树是否是二叉排序树

解决要点:

1.后序遍历二叉树;

2.递归。

核心算法:

bool isBalanced(pTree pT,int *depth)
{
	if(!pT)//參数推断
	{
		*depth = 0;
		return true;
	}
	//后序遍历
	int left,right;
	if(isBalanced(pT->lChild,&left) && isBalanced(pT->rChild,&right))
	{
		int differ = left-right;
		if(differ >= -1 && differ <= 1)
		{        //记录深度
			*depth = (left > right) ? left+1 : right+1;
			return true;
		}
	}
	return false;
}
bool isBalanced(pTree root)//传入二叉树根节点
{
	int depth = 0;
	return isBalanced(root,&depth);
}

完整程序:

/*********************************
推断二叉树是否是平衡二叉树
by Rowandjj
2014/7/13
*********************************/
#include<iostream>
using namespace std;
typedef struct _NODE_
{
	int data;
	struct _NODE_ *lChild;
	struct _NODE_ *rChild;
}TreeNode,*pTree;
void Create(pTree *pT)
{
	int e;
	cin>>e;
	if(e != -1)
	{
		*pT = (TreeNode*)malloc(sizeof(TreeNode));
		if(!pT)
		{
			exit(-1);
		}
		(*pT)->data = e;
		(*pT)->lChild = NULL;
		(*pT)->rChild = NULL;
		Create(&(*pT)->lChild);
		Create(&(*pT)->rChild);
	}
}
bool isBalanced(pTree pT,int *depth)
{
	if(!pT)
	{
		*depth = 0;
		return true;
	}

	int left,right;
	if(isBalanced(pT->lChild,&left) && isBalanced(pT->rChild,&right))
	{
		int differ = left-right;
		if(differ >= -1 && differ <= 1)
		{
			*depth = (left > right) ? left+1 : right+1;
			return true;
		}
	}
	return false;
}
bool isBalanced(pTree root)//传入二叉树根节点
{
	int depth = 0;
	return isBalanced(root,&depth);
}
void travel(pTree pT)
{
	if(pT != NULL)
	{
		travel(pT->lChild);
		travel(pT->rChild);
		cout<<pT->data<<" ";
	}
}
int main()
{
	pTree pT;
	Create(&pT);
	travel(pT);
	cout<<endl;
	cout<<isBalanced(pT);
	return 0;
}
时间: 2024-10-10 12:05:26

推断二叉树是否平衡的相关文章

判断二叉树是否平衡

题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 注:这里不考虑该二叉树是否是二叉排序树 解决要点: 1.后序遍历二叉树: 2.递归. 核心算法: bool isBalanced(pTree pT,int *depth) { if(!pT)//参数判断 { *depth = 0; return true; } //后序遍历 int left,right; if(isBalanced(pT->lChild,&

判断一个二叉树是否平衡

判断二叉树是否平衡的方法是求左右儿子的深度相差是否大于1,大于则这个二叉树不平衡. class Solution { public: int height(TreeNode *root) {//求节点的高度 if(root == NULL)return 0; return max(height(root->left), height(root->right)) + 1; } bool isBalanced(TreeNode* root) { if(root == NULL)return tru

编程算法 - 推断二叉树是不是平衡树 代码(C)

推断二叉树是不平衡树 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一颗二叉树的根结点, 推断该树是不是平衡二叉树. 二叉平衡树: 随意结点的左右子树的深度相差不超过1. 使用后序遍历的方式, 而且保存左右子树的深度, 进行比較. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <std

检查二叉树是否平衡

实现一个函数,检查二叉树是否平衡.在这个问题中.平衡树的定义例如以下:随意一个结点.其两棵子树的高度差不超过1. 直接递归訪问整棵树,计算每一个结点两棵子树的高度. public static int getHeight(TreeNode root) { if(root == null) return 0;//终止条件 return Math.max(getHeight(root.left), getHeight(root.right))+1; } public static boolean i

二叉树的深度 判断二叉树是否平衡 38

? ? 问题一 ? ? 引言 ? ? 在之前我们讲到过如果保存树根节点到叶子节点之间的路径,其中包含了如何判断一个节点是否是叶子节点,而且用栈保存了路径中的节点,只要遍历一下栈即可,然后用一个深度保存所有遍历深度中的最大值 ? ? 但仔细想想,这种方法是否过于繁琐,我们其实不需要一个完整的路径,为什么要去用一个栈保留路径呢,我们仅仅需要的是深度而已,所以我们可以从深度的角度出发去思考问题 ? ? 分析问题 ? ? 考虑递归,一棵树的深度一定是左子树和右子树深度较大值加1 ? ? 左子树如果是空,

【记录】2015/216数据结构大型实验 模拟登陆用户系统 二叉树的平衡 C++ MFC

含源代码及实验报告 http://pan.baidu.com/s/1boydZe3 MFC的使用.控件的继承.消息的重载

【查找结构3】平衡二叉查找树 [AVL]

在上一个专题中,我们在谈论二叉查找树的效率的时候.不同结构的二叉查找树,查找效率有很大的不同(单支树结构的查找效率退化成了顺序查找).如何解决这个问题呢?关键在于如何最大限度的减小树的深度.正是基于这个想法,平衡二叉树出现了. 平衡二叉树的定义 (AVL—— 发明者为Adel'son-Vel'skii 和 Landis) 平衡二叉查找树,又称 AVL树. 它除了具备二叉查找树的基本特征之外,还具有一个非常重要的特点:它 的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值(平衡因子

基本数据结构之二叉树

C语言实现二叉树的遍历 二叉树结点的定义 /* 先序,中序,后序的遍历时间复杂度为O(n),每个结点只访问一次. 层序的时间复杂度最差为O(n^2),当二叉树基本平衡时,时间复杂度为O(n) n为结点个数 */ typedef int tree_node_element; /** * @author 韦轩 * @time 2015/07/11 * @brief 二叉树的结点数据结构 * */ typedef struct binary_tree_node { binary_tree_node*

数据结构之---二叉树C实现

学过数据结构的都知道树.那么什么是树? 树(tree)是包括n(n>0)个结点的有穷集.当中: (1)每一个元素称为结点(node): (2)有一个特定的结点被称为根结点或树根(root). (3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,--Tm-1,当中每个集合Ti(1<=i<=m)本身也是一棵树.被称作原树的子树(subtree). 树也能够这样定义:树是由根结点和若干颗子树构成的.树是由一个集合以及在该集合上定义的一种关系构成的.集合中的元素称为树的