如何判断二叉树是否平衡

题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过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);
}

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

完整程序:

/*********************************
判断二叉树是否是平衡二叉树
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;
}

作者:csdn博客 RowandJJ

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, 二叉树
, return
, 平衡二叉树
, 二叉树深度遍历可视化
, 平衡树
, 二叉树排序
, pt
, 平衡二叉树课程设计
right
如何判断平衡二叉树、判断是否为平衡二叉树、判断是否是平衡二叉树、判断平衡二叉树、判断平衡二叉树 java,以便于您获取更多的相关知识。

时间: 2024-11-01 00:08:00

如何判断二叉树是否平衡的相关文章

判断二叉树是否平衡、是否完全二叉树、是否二叉排序树

1.判断二叉树是否平衡 //求树的高度 int TreeDepth(Node* t) { int hl,hr,h; if(t != NULL) { hl = TreeDepth(t->left); hr = TreeDepth(t->right); h = hl>hr? hl:hr; return h+1; } return 0; } //判断二叉树是否平衡 int isBalanced(Node* t) { if(t==NULL) return 1; int leftDepth = T

检查一个二叉树是否平衡的算法分析与C++实现

今天面试一个实习生,就想既然是未出校园,那就出一个比较基础的题吧,没想到答的并不如人意,对于树的操作完全不熟悉,因此此题算是未作答.原来我想看一下他分析问题的思路,优化代码的能力.接下来会把最近半年我出的面试题整理出来,以来share给其它同事,而来算是自己校园记忆的一个总结,毕竟自己在项目中已经很久未用到这些知识.其实很多题目都是来源于CareerCup.com.这上面汇集了许多IT名企的面试笔试题目,非常值得找工作的人学习. 言归正传,什么是二叉树是否平衡的定义,如果面试者不知道,那肯定要提

一波C语言二元查找树算法题目解答实例汇总_C 语言

按层次遍历二元树问题描述:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印.  例如输入: 8 / / 6 10 / / / / 5 7 9 11 输出 8 6 10 5 7 9 11           定义二元树(其实是二元搜索树,但并不遍历算法)的结点为: struct BSTreeNode { int value; BSTreeNode *left; BSTreeNode *right; };       思路:利用队列的先进先出,很容易实现.每次取出队列的首

c语言二叉树问题,代码不太理解,求大神解释,急

问题描述 c语言二叉树问题,代码不太理解,求大神解释,急 问题:A Binary Tree is called balanced if, for each node in the tree, the height of its left and right subtrees differ by no more than one. Write a function int height_if_balanced( Tnode *root ) which returns -1 if the tree

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

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

【数据结构】回顾二叉树

1.为什么会有树?因为当有大量的输入数据时,链表的线性访问时间就显得略长了.而树结构,其大部分操作的运行时间平均为O(logN). 2.树的实现并不难,几行代码就搞定了. struct TreeNode { Object element; TreeNode *firstChild; TreeNode *nextSibling; } 3.遍历形式: // 中序遍历二叉树 void inorder(tree_pointer ptr) { if(ptr) { inorder(ptr->left_chi

数据映射--平衡二叉有序树

上次我们提到了使用有序的数组来进行二分查找,从而提高映射查询的效率,使时间复杂度从O(n)降低到O(log2N). 本周让我来介绍一下二叉树. 一谈到二叉树,相信很多人一定会有一个疑问: 这玩意儿有什么用? (当然这么多人里面肯定包括大学时候的我- -) 其实,我个人觉得这并不怪我们,是教科书写的有点问题,开始的时候没有给到大家明确的学习意义,开始就去讲如何遍历,如何从树变森林,如何做树的前序中序后序遍历.但这样的学习会让整个过程很无聊,太容易让人放弃了.所以在今天,请允许我用另外的方式来重新讲

数据结构实践项目——树和二叉树(1)

本文针对[数据结构基础系列(6):树和二叉树]第1-6, 8-10课时 1 树结构导学 2 树的基本概念 3 树的基本术语 4 树的性质 5 树的存储结构 6 二叉树概念和性质 8 二叉树的存储结构 9 二叉树的基本运算及其实现 10 二叉树的遍历 [项目1 - 二叉树算法库] 定义二叉树的链式存储结构,实现其基本运算,并完成测试. 要求: 1.头文件btree.h中定义数据结构并声明用于完成基本运算的函数.对应基本运算的函数包括: void CreateBTNode(BTNode *&b,ch

[LeetCode] Binary Tree Paths - 二叉树基础系列题目

目录:1.Binary Tree Paths - 求二叉树路径 2.Same Tree - 判断二叉树相等 3.Symmetric Tree - 判断二叉树对称镜像 Binary Tree Paths 题目概述:Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 / \ 2 3 \ 5 All root-to-leaf paths are: ["1-