zoukankan      html  css  js  c++  java
  • 《剑指offer》第五十五题(平衡二叉树)

    // 面试题55(二):平衡二叉树
    // 题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中
    // 任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
    
    #include <iostream>
    #include "BinaryTree.h"
    
    // ====================方法1====================
    //迭代的从上到下,判断每个节点是否是平衡树,会导致一个节点的深度重复计算
    
    int TreeDepth(const BinaryTreeNode* pRoot)//检测节点深度
    {
        if (pRoot == nullptr)
            return 0;
    
        int nLeft = TreeDepth(pRoot->m_pLeft);
        int nRight = TreeDepth(pRoot->m_pRight);
    
        return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
    }
    
    bool IsBalanced_Solution1(const BinaryTreeNode* pRoot)//记录
    {
        if (pRoot == nullptr)
            return true;
    
        int left = TreeDepth(pRoot->m_pLeft);
        int right = TreeDepth(pRoot->m_pRight);
        int diff = left - right;
        if (diff > 1 || diff < -1)
            return false;
    
        return IsBalanced_Solution1(pRoot->m_pLeft)
            && IsBalanced_Solution1(pRoot->m_pRight);
    }
    
    // ====================方法2====================
    //从下到上检测,如果节点是平衡树,就记录其深度,每个节点被计算一次
    bool IsBalanced(const BinaryTreeNode* pRoot, int* pDepth);
    
    bool IsBalanced_Solution2(const BinaryTreeNode* pRoot)
    {
        int depth = 0;
        return IsBalanced(pRoot, &depth);
    }
    
    bool IsBalanced(const BinaryTreeNode* pRoot, int* pDepth)
    {
        if (pRoot == nullptr)
        {
            *pDepth = 0;
            return true;
        }
    
        int left, right;
        if (IsBalanced(pRoot->m_pLeft, &left)
            && IsBalanced(pRoot->m_pRight, &right))//if条件是找到子节点开始从下向上判断节点是不是平衡树
        {
            int diff = left - right;
            if (diff <= 1 && diff >= -1)//如果是,记录最大深度
            {
                *pDepth = 1 + (left > right ? left : right);
                return true;
            }
        }
    
        return false;
    }
    
    // ====================测试代码====================
    void Test(const char* testName, const BinaryTreeNode* pRoot, bool expected)
    {
        if (testName != nullptr)
            printf("%s begins:
    ", testName);
    
        printf("Solution1 begins: ");
        if (IsBalanced_Solution1(pRoot) == expected)
            printf("Passed.
    ");
        else
            printf("Failed.
    ");
    
        printf("Solution2 begins: ");
        if (IsBalanced_Solution2(pRoot) == expected)
            printf("Passed.
    ");
        else
            printf("Failed.
    ");
    }
    
    // 完全二叉树
    //             1
    //         /      
    //        2        3
    //       /       / 
    //      4  5     6   7
    void Test1()
    {
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
        BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
        BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
    
        ConnectTreeNodes(pNode1, pNode2, pNode3);
        ConnectTreeNodes(pNode2, pNode4, pNode5);
        ConnectTreeNodes(pNode3, pNode6, pNode7);
    
        Test("Test1", pNode1, true);
    
        DestroyTree(pNode1);
    }
    
    // 不是完全二叉树,但是平衡二叉树
    //             1
    //         /      
    //        2        3
    //       /         
    //      4  5         6
    //        /
    //       7
    void Test2()
    {
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
        BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
        BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
    
        ConnectTreeNodes(pNode1, pNode2, pNode3);
        ConnectTreeNodes(pNode2, pNode4, pNode5);
        ConnectTreeNodes(pNode3, nullptr, pNode6);
        ConnectTreeNodes(pNode5, pNode7, nullptr);
    
        Test("Test2", pNode1, true);
    
        DestroyTree(pNode1);
    }
    
    // 不是平衡二叉树
    //             1
    //         /      
    //        2        3
    //       /         
    //      4  5        
    //        /
    //       6
    void Test3()
    {
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
        BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
    
        ConnectTreeNodes(pNode1, pNode2, pNode3);
        ConnectTreeNodes(pNode2, pNode4, pNode5);
        ConnectTreeNodes(pNode5, pNode6, nullptr);
    
        Test("Test3", pNode1, false);
    
        DestroyTree(pNode1);
    }
    
    
    //               1
    //              /
    //             2
    //            /
    //           3
    //          /
    //         4
    //        /
    //       5
    void Test4()
    {
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    
        ConnectTreeNodes(pNode1, pNode2, nullptr);
        ConnectTreeNodes(pNode2, pNode3, nullptr);
        ConnectTreeNodes(pNode3, pNode4, nullptr);
        ConnectTreeNodes(pNode4, pNode5, nullptr);
    
        Test("Test4", pNode1, false);
    
        DestroyTree(pNode1);
    }
    
    // 1
    //  
    //   2
    //    
    //     3
    //      
    //       4
    //        
    //         5
    void Test5()
    {
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    
        ConnectTreeNodes(pNode1, nullptr, pNode2);
        ConnectTreeNodes(pNode2, nullptr, pNode3);
        ConnectTreeNodes(pNode3, nullptr, pNode4);
        ConnectTreeNodes(pNode4, nullptr, pNode5);
    
        Test("Test5", pNode1, false);
    
        DestroyTree(pNode1);
    }
    
    // 树中只有1个结点
    void Test6()
    {
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        Test("Test6", pNode1, true);
    
        DestroyTree(pNode1);
    }
    
    // 树中没有结点
    void Test7()
    {
        Test("Test7", nullptr, true);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        Test6();
        Test7();
        system("pause");
        return 0;
    }
  • 相关阅读:
    ERROR Function not available to this responsibility.Change responsibilities or contact your System Administrator.
    After Upgrade To Release 12.1.3 Users Receive "Function Not Available To This Responsibility" Error While Selecting Sub Menus Under Diagnostics (Doc ID 1200743.1)
    产品设计中先熟练使用铅笔 不要依赖Axure
    12.1.2: How to Modify and Enable The Configurable Home Page Delivered Via 12.1.2 (Doc ID 1061482.1)
    Reverting back to the R12.1.1 and R12.1.3 Homepage Layout
    常见Linux版本
    网口扫盲二:Mac与Phy组成原理的简单分析
    VMware 8安装苹果操作系统Mac OS X 10.7 Lion正式版
    VMware8安装MacOS 10.8
    回顾苹果操作系统Mac OS的发展历史
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10541084.html
Copyright © 2011-2022 走看看