判断一棵树是不是AVL树

这里的AVL树指的是,在BST树的基础上,满足任意结点的平衡因子绝对值小于2


判断主程序:

bool JudgeAvl(TreeNode *root, int min, int max, int &deepth){
    if(root == NULL) return true;
    if(root->val < min || root->val > max) return false; //用于判断是不是BST
    int left_deepth = 0, right_deepth = 0;
    if(JudgeAvl(root->left, min, root->val, left_deepth) && JudgeAvl(root->right, root->val, max, right_deepth)){
        if(abs(left_deepth - right_deepth) >= 2)   //判断平衡因子是否小于2
            return false;
        deepth = (left_deepth > right_deepth) ? (left_deepth + 1):(right_deepth + 1);  //得到当前结点的深度,一定要传引用
        return true;
    }   
    return false;
}

调用主接口:

int main(void)
{
    TreeNode *root = NULL;
    PreoderBuildTree(root);
    int tree_deepth = 0;
    if(JudgeAvl(root, INT_MIN, INT_MAX, tree_deepth))
        std::cout << "TRUE" << std::endl;
    else
        std::cout << "FALSE" << std::endl;
}


判断一棵二叉是否为 AVL ,需要满足以下两个条件: 1. 该二叉的所有子都是 AVL ; 2. 该二叉的任意两个子高度差的绝对值不超过 1。 其中,子的高度指的是该子的根节点到叶子节点的最长路径长度。 因此,判断一棵二叉是否为 AVL ,需要对该二叉进行递归遍历,依次判断每个子是否为 AVL ,并计算每个子的高度,最后再判断任意两个子高度差的绝对值是否不超过 1。如果满足以上两个条件,则该二叉AVL ,否则不是 AVL 。 具体实现过程可以参考以下代码(假设二叉的节点结构为 Node,其包含 left、right、height 三个属性): ```python def is_avl_tree(root): # 辅助函数,计算节点高度 def get_height(node): if not node: return 0 return node.height # 判断一棵二叉是否为 AVL def is_avl_tree_helper(node): if not node: return True # 判断左右子是否为 AVL if not is_avl_tree_helper(node.left) or not is_avl_tree_helper(node.right): return False # 计算左右子的高度差 height_diff = abs(get_height(node.left) - get_height(node.right)) if height_diff > 1: return False # 更新当前节点的高度 node.height = max(get_height(node.left), get_height(node.right)) + 1 return True # 判断根节点是否为空,为空则返回 False if not root: return False return is_avl_tree_helper(root) ``` 注意,以上代码仅为示例,具体实现可能因语言和实际情况的不同而有所差异。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值