面试题39:二叉树的深度

来源:互联网 发布:双十一家电销售数据 编辑:程序博客网 时间:2024/05/16 10:45
/*题目1:输入一棵二叉树的结点,求该树的深度。从根节点到叶节点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度*//*题目2:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。*/#include <iostream>using namespace std;//定义一个二叉树结点struct BinaryTreeNode{    int m_nValue;    BinaryTreeNode *m_pLeft;    BinaryTreeNode *m_pRight;};//创建一个二叉树结点BinaryTreeNode *CreateBinaryTreeNode(int Value){    BinaryTreeNode *pNode = new BinaryTreeNode;    pNode -> m_nValue = Value;    pNode -> m_pLeft = NULL;    pNode -> m_pRight = NULL;    return pNode;}//创建二叉树void ConnectBinaryTreeNode(BinaryTreeNode *pRoot, BinaryTreeNode *pLeft, BinaryTreeNode *pRight){    pRoot -> m_pLeft = pLeft;    pRoot -> m_pRight = pRight;}//释放二叉树空间void DestroyBinaryTreeNode(BinaryTreeNode *pRoot){    if(pRoot)    {        DestroyBinaryTreeNode(pRoot -> m_pLeft);        DestroyBinaryTreeNode(pRoot -> m_pRight);        delete pRoot;    }}//计算二叉树的深度int BinaryTreeDepth(BinaryTreeNode *pRoot){    if(pRoot == NULL)    return 0;    int Left = BinaryTreeDepth(pRoot -> m_pLeft);    int Right = BinaryTreeDepth(pRoot -> m_pRight);    return 1 + (Left > Right ? Left : Right);}//判断二叉树是不是平衡二叉树bool IsBalancedBinaryTree(BinaryTreeNode *pRoot, int *pDepth){    //递归退出条件,同时存储对应结点的二叉树深度    if(pRoot == NULL)    {        *pDepth = 0;        return true;    }    int Left = 0;    int Right = 0;    //递归判断是否符合平衡二叉树的条件,同时存储二叉树深度(后序遍历二叉树)    if(IsBalancedBinaryTree(pRoot -> m_pLeft, &Left) && IsBalancedBinaryTree(pRoot -> m_pRight, &Right))    {        int dif = Left - Right;        if(dif <= 1 && -1 <= dif)        {            *pDepth = 1 + (Left > Right ? Left : Right);            return true;        }    }    return false;}//重载二叉树判断函数,同时传入相应参数bool IsBalancedBinaryTree(BinaryTreeNode *pRoot){    int pDepth = 0;    return IsBalancedBinaryTree(pRoot, &pDepth);}//========================测试代码========================void Test(char *TestName, BinaryTreeNode *pRoot, int ExpectedDepth, bool ExpectedResult){    if(TestName != NULL)    cout << TestName << " begins:" << endl;    if(BinaryTreeDepth(pRoot) == ExpectedDepth)    cout << "Depth Passed!" << endl;    else    cout << "Depth Failed!" << endl;    if(IsBalancedBinaryTree(pRoot) == ExpectedResult)    cout << "Test Passed!" << endl;    else    cout << "Test  Failed!" << endl;}//完全二叉树//                      1//                    /   \//                   2     3//                  / \   / \//                 4   5  6  7void 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);    ConnectBinaryTreeNode(pNode1, pNode2, pNode3);    ConnectBinaryTreeNode(pNode2, pNode4, pNode5);    ConnectBinaryTreeNode(pNode3, pNode6, pNode7);    Test("Test1", pNode1, 3, true);    DestroyBinaryTreeNode(pNode1);}//不是完全二叉树,但是平衡二叉树//                      1//                    /   \//                   2     3//                  / \     \//                 4   5     6//                    ///                    7void 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);    ConnectBinaryTreeNode(pNode1, pNode2, pNode3);    ConnectBinaryTreeNode(pNode2, pNode4, pNode5);    ConnectBinaryTreeNode(pNode3, NULL, pNode6);    ConnectBinaryTreeNode(pNode5, pNode7, NULL);    Test("Test2", pNode1, 4, true);    DestroyBinaryTreeNode(pNode1);}//不是平衡二叉树//                      1//                    /   \//                   2     3//                  / \//                 4   5//                    ///                    6void 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);    BinaryTreeNode *pNode7 = CreateBinaryTreeNode(7);    ConnectBinaryTreeNode(pNode1, pNode2, pNode3);    ConnectBinaryTreeNode(pNode2, pNode4, pNode5);    ConnectBinaryTreeNode(pNode5, pNode6, NULL);    Test("Test3", pNode1, 4, false);    DestroyBinaryTreeNode(pNode1);}//任意结点的右子树深度均为1,不是平衡二叉树//              1//              ///             2//            ///           3//          ///         4//        ///       5void Test4(){    BinaryTreeNode *pNode1 = CreateBinaryTreeNode(1);    BinaryTreeNode *pNode2 = CreateBinaryTreeNode(2);    BinaryTreeNode *pNode3 = CreateBinaryTreeNode(3);    BinaryTreeNode *pNode4 = CreateBinaryTreeNode(4);    BinaryTreeNode *pNode5 = CreateBinaryTreeNode(5);    ConnectBinaryTreeNode(pNode1, pNode2, NULL);    ConnectBinaryTreeNode(pNode2, pNode3, NULL);    ConnectBinaryTreeNode(pNode3, pNode4, NULL);    ConnectBinaryTreeNode(pNode4, pNode5, NULL);    Test("Test4", pNode1, 5, false);    DestroyBinaryTreeNode(pNode1);}//任意结点的左子树深度均为1,不是平衡二叉树// 1//  \//   2//    \//     3//      \//       4//        \//         5void Test5(){    BinaryTreeNode *pNode1 = CreateBinaryTreeNode(1);    BinaryTreeNode *pNode2 = CreateBinaryTreeNode(2);    BinaryTreeNode *pNode3 = CreateBinaryTreeNode(3);    BinaryTreeNode *pNode4 = CreateBinaryTreeNode(4);    BinaryTreeNode *pNode5 = CreateBinaryTreeNode(5);    ConnectBinaryTreeNode(pNode1, NULL, pNode2);    ConnectBinaryTreeNode(pNode2, NULL, pNode3);    ConnectBinaryTreeNode(pNode3, NULL, pNode4);    ConnectBinaryTreeNode(pNode4, NULL, pNode5);    Test("Test5", pNode1, 5, false);    DestroyBinaryTreeNode(pNode1);}//树上只有一个结点void Test6(){    BinaryTreeNode *pNode1 = CreateBinaryTreeNode(1);    Test("Test6", pNode1, 1, true);    DestroyBinaryTreeNode(pNode1);}//输入空树void Test7(){    Test("Test7", NULL, 0, true);}int main(){    Test1();    Test2();    Test3();    Test4();    Test5();    Test6();    Test7();    return 0;}

原创粉丝点击