How to determine if binary tree is balanced?

前端 未结 27 1527
萌比男神i
萌比男神i 2020-11-30 16:11

It\'s been a while from those school years. Got a job as IT specialist at a hospital. Trying to move to do some actual programming now. I\'m working on binary trees now, a

27条回答
  •  猫巷女王i
    2020-11-30 16:46

    #include 
    #include 
    #include 
    
    struct node
    {
        int data;
        node *left;
        node *right;
    };
    
    bool isBalanced(node *root)
    {
        if ( !root)
        {
            return true;
        }
    
        std::queue q1;
        std::queue  q2;
        int level = 0, last_level = -1, node_count = 0;
    
        q1.push(root);
        q2.push(level);
    
        while ( !q1.empty() )
        {
            node *current = q1.front();
            level = q2.front();
    
            q1.pop();
            q2.pop();
    
            if ( level )
            {
                ++node_count;
            }
    
                    if ( current->left )
                    {
                            q1.push(current->left);
                            q2.push(level + 1);
                    }
    
                    if ( current->right )
                    {
                            q1.push(current->right);
                            q2.push(level + 1);
                    }
    
            if ( level != last_level )
            {
                std::cout << "Check: " << (node_count ? node_count - 1 : 1) << ", Level: " << level << ", Old level: " << last_level << std::endl;
                if ( level && (node_count - 1) != (1 << (level-1)) )
                {
                    return false;
                }
    
                last_level = q2.front();
                if ( level ) node_count = 1;
            }
        }
    
        return true;
    }
    
    int main()
    {
        node tree[15];
    
        tree[0].left  = &tree[1];
        tree[0].right = &tree[2];
        tree[1].left  = &tree[3];
        tree[1].right = &tree[4];
        tree[2].left  = &tree[5];
        tree[2].right = &tree[6];
        tree[3].left  = &tree[7];
        tree[3].right = &tree[8];
        tree[4].left  = &tree[9];   // NULL;
        tree[4].right = &tree[10];  // NULL;
        tree[5].left  = &tree[11];  // NULL;
        tree[5].right = &tree[12];  // NULL;
        tree[6].left  = &tree[13];
        tree[6].right = &tree[14];
        tree[7].left  = &tree[11];
        tree[7].right = &tree[12];
        tree[8].left  = NULL;
        tree[8].right = &tree[10];
        tree[9].left  = NULL;
        tree[9].right = &tree[10];
        tree[10].left = NULL;
        tree[10].right= NULL;
        tree[11].left = NULL;
        tree[11].right= NULL;
        tree[12].left = NULL;
        tree[12].right= NULL;
        tree[13].left = NULL;
        tree[13].right= NULL;
        tree[14].left = NULL;
        tree[14].right= NULL;
    
        std::cout << "Result: " << isBalanced(tree) << std::endl;
    
        return 0;
    }
    

提交回复
热议问题