二叉树——判断一棵树是否是平衡二叉树

平衡二叉树 (空树或者左右两个孩子高度差不超过1)

在涉及到二叉树的题目时,递归函数非常好用

列出可能性-》整理出返回值的类型-》整个递归过程按照同样的结构得到子树的信息,整合子树的信息,加工出应该返回的信息,向上返回

1.左子树是否平衡

2.右子树是否平衡

3.左子树的高度

4.右子树的高度

根据可能性,使用递归函数

可能性-》返回值的类型

//列出可能性  左右子树是否分别平衡,若平衡后,左右子树的高度
    public static class ReturnData{
        boolean isB;
        int high;

        public ReturnData(boolean isB, int high){
            this.isB = isB;
            this.high = high;
        }
    }

  

整个递归过程按照同样的结构得到子树的信息(左子树和右子树分别是否平衡,以及它们的高度),整合子树的信息(左右子树的高度差是否符合要求),加工出返回的信息(应该返回左右子树中,高度较大的那一个high+1

public static ReturnData process(Tree tree){
        if(tree == null) return new ReturnData(true, 0);

        ReturnData leftData = process(tree.left);
        if(!leftData.isB){
            return new ReturnData(false, 0);
        }

        ReturnData rightData = process(tree.right);
        if(!rightData.isB){
            return new ReturnData(false, 0);
        }

        if(Math.abs(leftData.high - rightData.high) > 1){
            return new ReturnData(false, 0);
        }

        return new ReturnData(true, Math.max(leftData.high, rightData.high) + 1);
    }

  

整体的代码

public class IsBanlancedTree {

    //列出可能性  左右子树是否分别平衡,若平衡后,左右子树的高度
    public static class ReturnData{
        boolean isB;
        int high;

        public ReturnData(boolean isB, int high){
            this.isB = isB;
            this.high = high;
        }
    }

    public static ReturnData process(Tree tree){
        if(tree == null) return new ReturnData(true, 0);

        ReturnData leftData = process(tree.left);
        if(!leftData.isB){
            return new ReturnData(false, 0);
        }

        ReturnData rightData = process(tree.right);
        if(!rightData.isB){
            return new ReturnData(false, 0);
        }

        if(Math.abs(leftData.high - rightData.high) > 1){
            return new ReturnData(false, 0);
        }

        return new ReturnData(true, Math.max(leftData.high, rightData.high) + 1);
    }

    public static boolean isBanlancedTree(Tree tree){
        return process(tree).isB;
    }
}

  

  

原文地址:https://www.cnblogs.com/SkyeAngel/p/8947290.html

时间: 2024-10-03 15:15:31

二叉树——判断一棵树是否是平衡二叉树的相关文章

二叉树——判断一棵树是否是完全二叉树

二叉树按层遍历 判断条件:结点的左右孩子只有4种情况 其中的三种情况有特例 条件1.结点有右孩子,没有左孩子,直接返回false 条件2.结点左右孩子不全(有左没右,左右都没有),则后面遇到的所有结点,都必须是叶节点 只要不违反1.2的,就是完全二叉树 原文地址:https://www.cnblogs.com/SkyeAngel/p/8947531.html

判断一棵树是否为完全二叉树

完全二叉树:若一棵二叉树具有具有n个节点,它的每个节点都与高度为k的满二叉树编号为0~n-1结点一一对应,则称这可二叉树为完全二叉树. 方法一:一维数组存储 根据完全二叉树的定义和性质,利用一位数组作为完全二叉树的存储,如下图 由图,节点的编号与数组元素的下标是一一对应的,可根据二叉树的性质,可方便找出下标 为i的的双亲结点a[i/2]及左右孩子结点a[i*2],a[i*2+1].这样判断一棵树是否为二叉树,应该对此二叉树从上到下,从左到右依次编号, 然后把编好的号依次存入一位数组中,在与相应深

判断一棵树是否是二叉搜索树

前两天写过一篇博文<二叉搜索树基本操作实现>,为了更深入了解二叉搜索树的性质,本文实现判断一棵树是否为二叉搜索树算法. 二叉搜索树的性质: 任意节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值. 构造二叉树的节点定义为: struct TreeNode{ int data; TreeNode *left; TreeNode *right; }; 方法1 (错误) 对每一个节点,检测其值是否大于左子树节点,是否小于右子树节点.思路很简单,代码实现如下: bool

判断一棵树是否为二叉搜索树(二叉排序树) python

输入一棵树,判断这棵树是否为二叉搜索树.首先要知道什么是排序二叉树,二叉排序树是这样定义的,二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树: (4)没有键值相等的节点 #方法1,直接判断 直接判断的关键在于不能只是单纯地判断根.左.右三个节点的大小关系,左子树的右节点不仅要大于父节点,还要小于父节点的父节点,右子树的左节点

【LeetCode】Symmetric Tree 判断一棵树是否是镜像的

题目:Symmetric Tree <span style="font-size:18px;">/**LeetCode Symmetric Tree 对称的树 * 思路:判断一棵树是否对称,1.有左子树就要有右子树 * 2.除根节点外对称节点值要相同 * 注意:对称后就是左子树的左节点和右子树的右节点比较 * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; *

判断一棵树是否是另一棵树的子树

问题 判断一棵树是否是另一棵树的子树,如图 思路 问题分两步: 找值相同的根结点(遍历解决) 判断两结点是否包含(递归:值.左孩子.右孩子分别相同) 代码 bool IsPart(TreeNode *root1, TreeNode *root2) { if (root2 == NULL) return true; if (root1 == NULL) return false; if (root1->val != root2->val) return false; return IsPart(

怎样推断一棵树是否是平衡二叉树

推断的思路非常easy.若一棵树是平衡二叉树,它的左右子树都是平衡二叉树,而且左右子树的高度差小于等于1.注意.实现的时候,推断左右子树的平衡性时.能够顺便计算子树高度,不用再另外计算一次.以下是其递归实现: #include <iostream> using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right

判断一颗树是否为平衡二叉树

struct BinaryTreeNode { int m_Value; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; int height(BinaryTreeNode*node ,bool&balance) { if(node==NULL) { return 0;} int R=node->right?height(node->right,balance)+1:0; if(!balance) return 0; int

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

主要就是判断二叉树深度进行改造.判断条件为左树为平衡树,右树为平衡树,并且左树的高度和右树的高度插不超过-1:public class IsAVL { public static class Node{ private Node left; private Node right; private int value; public Node(int value){ this.value = value; } } public static int isAVL(Node head){ if(hea