zoukankan      html  css  js  c++  java
  • 平衡二叉树的判断

    平衡二叉树的判断

    如何判断是否为平衡二叉树?

    答:每个节点的左右子树高度差的绝对值小于等于1,我们认为该二叉树平衡;

    只要有一个节点的左右子树高度差绝对值大于1,我们认为这颗二叉树不平衡

    因此,判断一棵树是否平衡,需要计算树的高度以及判断高度差。

    下面介绍两种判断平衡二叉树的方式:自顶向下自底向上

    树节点的定义

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    

    自顶向下

    伪码描述

    int getHeight(TreeNode* root){
        if(root为空节点) return 0;
        return 左子树与右子树的最大高度+1;
    }
    bool isBalanced(TreeNode* root){
        if(root为空节点) return ture;
        if(左子树为平衡树且右子树为平衡树)
            if(左子树与右子树的高度差小于2)
                return true;
        return false;
    }
    

    Talk is cheap . Show me the code

    int getHeight(TreeNode* root){
    	if(root==NULL) return 0;
    	return max(getHeight(root->right),getHeight(root->left))+1;
    }
    
    bool isBalanced(TreeNode* root) {
    	if(root==NULL) return true;
    	if(isBalanced(root->left)&&isBalanced(root->right))
    		if(abs(getHeight(root->left)-getHeight(root->right))<2)
    			return true;
        return false;
    }
    

    算法分析:

    时间复杂度:

    [O(nlog n) ]

    空间复杂度:

    [O(n) ]

    这不是最优算法,出现了很多冗余计算,getHeight函数显然要被重复调用很多次。计算每一个节点的时候,都重复计算了子节点的高度,浪费计算机算力,重复计算已经计算过的结果显然是不合适的。

    解决的办法也呼之欲出,将每次计算出的高度传出来保存不就好了?

    于是有了下面自底向上的方法。这样可以充分利用每次计算的高度的结果,降低计算量。

    自底向上

    伪码描述

    int isBalancedHelper(TreeNode* root,int& height){
        if(root为空节点){
            height=0;
            return true;
        }
        int left,right;
        if(判断右子树是否是平衡数并把高度赋给right&&判断左子树是否是平衡数并把高度赋给left)
            if(left与right的差的绝对值小于2){
                height=left与right的最大值+1;
                return true;
            }
        return false;
    }
    bool isBalanced(TreeNode* root) {
        int height=0;
        return isBalancedHelper(root,height);
    }
    

    Talk is cheap . Show me the code

    int isBalancedHelper(TreeNode* root,int& height){
        if(root==NULL){
            height=0;
            return true;
        }
        int left,right;
        if(isBalancedHelper(root->right,right)&&isBalancedHelper(root->left,left){
            if(abs(left-right)<2)){
                height=max(left,right)+1;
                return true;
            }
        }
        return false;
    }
    bool isBalanced(TreeNode* root) {
        int height=0;
        return isBalancedHelper(root,height);
    }
    

    算法分析:

    时间复杂度:

    [O(n) ]

    空间复杂度:

    [O(n) ]

    自底向上每次判断都把高度传了出去,并且每一次计算都充分利用子节点的高度数据,没有进行重复计算,在不提升空间复杂度的情况下,降低了整个算法的时间复杂度。

  • 相关阅读:
    MapReduce Design Patterns(4. 分层,分区)(七)
    MapReduce Design Patterns(3. Top Ten))(六)
    MapReduce Design Patterns(3. Top Ten))(六)
    树的子结构-剑指Offer
    合并两个排序的链表-剑指Offer
    反转链表-剑指Offer
    链表中倒数第k个结点-剑指Offer
    数值的整数次方-剑指Offer
    二进制中1的个数-剑指Offer
    变态跳台阶-剑指Offer
  • 原文地址:https://www.cnblogs.com/cell-coder/p/12355506.html
Copyright © 2011-2022 走看看