劍指offer-求二叉樹的樹深

/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//
 
/*
Q:
    二叉樹得蛇毒:
        輸入一顆二叉樹得根節點,求該樹得深度,從根節點到葉子節點依次經過得結點(包含
        根節點和葉子節點)形成樹得一條路徑,最長路徑得長度稱爲該樹得深度。
S:
    這樣理解樹深度:
        如果一棵樹只有一個結點,那麼它的深度是1.如果根節點只有左子樹而沒有右子樹,那麼
        樹的深度應該是左子樹深度加1;同樣如果根節點只有右子樹而沒有左子樹,那麼樹的深度
        是右子樹得深渡加1;如果既有左子樹也有右子樹,那麼樹的深度就是兩者中最大值加1.
*/

#include "../utils/BinaryTree.h"
#include <iostream>
#include <cstdio>
#include <cstdlib>

int treeDepth(BinaryTreeNode*T)
{
    if(T == nullptr)
        return 0;
    
    int left = treeDepth(T->m_pLeft);
    int right = treeDepth(T->m_pRight);
    return (left>right)?(left+1):(right+1);
}

void test_1()
{
    BinaryTreeNode*T1 = createBinaryTreeNode(1);
    BinaryTreeNode*T2 = createBinaryTreeNode(2);
    BinaryTreeNode*T3 = createBinaryTreeNode(3);
    BinaryTreeNode*T4 = createBinaryTreeNode(4);
    BinaryTreeNode*T5 = createBinaryTreeNode(5);
    BinaryTreeNode*T6 = createBinaryTreeNode(6);
    BinaryTreeNode*T7 = createBinaryTreeNode(7);

    connectTreeNodes(T1, T2, T3);
    connectTreeNodes(T2, T4, T5);
    connectTreeNodes(T3, nullptr, T6);
    connectTreeNodes(T5, T7, nullptr);
    printTreePreOrder(T1);

    std::cout << std::endl << "get tree depth : " << treeDepth(T1) << std::endl;
}

void test_2()
{
    BinaryTreeNode*T1 = createBinaryTreeNode(1);
    BinaryTreeNode*T2 = createBinaryTreeNode(2);
    BinaryTreeNode*T3 = createBinaryTreeNode(3);
    BinaryTreeNode*T4 = createBinaryTreeNode(4);
    BinaryTreeNode*T5 = createBinaryTreeNode(5);
    BinaryTreeNode*T6 = createBinaryTreeNode(6);
    BinaryTreeNode*T7 = createBinaryTreeNode(7);

    connectTreeNodes(T1, T2, nullptr);
    connectTreeNodes(T2, T3, nullptr);
    connectTreeNodes(T3, T4, nullptr);
    connectTreeNodes(T4, T5, nullptr);
    connectTreeNodes(T5, T6, nullptr);
    printTreePreOrder(T1);

    std::cout << std::endl << "get tree depth : " << treeDepth(T1) << std::endl;
}

void test_3()
{
    BinaryTreeNode*T1 = createBinaryTreeNode(1);
    BinaryTreeNode*T2 = createBinaryTreeNode(2);
    BinaryTreeNode*T3 = createBinaryTreeNode(3);
    BinaryTreeNode*T4 = createBinaryTreeNode(4);
    BinaryTreeNode*T5 = createBinaryTreeNode(5);
    BinaryTreeNode*T6 = createBinaryTreeNode(6);
    BinaryTreeNode*T7 = createBinaryTreeNode(7);

    connectTreeNodes(T1, nullptr, T2);
    connectTreeNodes(T2, nullptr, T3);
    connectTreeNodes(T3, nullptr, T4);
    connectTreeNodes(T4, nullptr, T5);
    connectTreeNodes(T5, nullptr, T6);
    printTreePreOrder(T1);

    std::cout << std::endl << "get tree depth : " << treeDepth(T1) << std::endl;
}

void test_4()
{
    BinaryTreeNode*T1 = createBinaryTreeNode(1);

    connectTreeNodes(T1, nullptr, nullptr);
    printTreePreOrder(T1);

    std::cout << std::endl << "get tree depth : " << treeDepth(T1) << std::endl;
}

void test_5()
{
    BinaryTreeNode*T1 = nullptr;

    connectTreeNodes(T1, nullptr, nullptr);
    printTreePreOrder(T1);

    std::cout << std::endl << "get tree depth : " << treeDepth(T1) << std::endl;
}

void test_treeDepth()
{
    test_1();
    test_2();
    test_3();
    test_4();
    test_5();
}

int main(int argc, char**argv)
{

    test_treeDepth();

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章