1. 程式人生 > >找出該樹中第二小的值--思路及算法實現

找出該樹中第二小的值--思路及算法實現

lob color 給定 ini 二叉 完全 當前 tiny program

  在二叉樹中最重要的操作莫過於遍歷,即按照某一順序訪問樹中的所有節點。二叉樹的前序遍歷、中序遍歷、後序遍歷都有遞歸和循環兩種不同的實現方法。每種遍歷的遞歸實現都比循環實現要簡潔很多。下面分享一個關於二叉樹遍歷到筆試題:

  給定一棵完全二叉樹,即樹中的每一個節點有2個子節點或者沒有子節點,每一個節點的值小於等於它的子節點的值。請找出該樹中第二小的值。如果沒有第二小的值,請給出-1;

  解題思路:畫圖舉例解決問題,如下圖所示,根節點是1,每一個節點的值小於等於它的子節點的值,訪問根節點後再先後訪問左子樹和右子樹,最後直到找到大於根節點的最小值;如果沒有第二小的值,給出-1。
  很明顯,根據題意在遍歷二叉樹時采用前序遞歸遍歷,得到的根節點和當前的第二小值比較,如果該值大於根節點(第一小的值)且小於第二最小值,則賦值給第二最小值。
  另外,分析二叉樹的結構可以做剪枝處理,因為每一個節點的值小於等於它的子節點的值,所以當該節點的值大於第二最小值時,其子節點肯定大於第二最小值,無需再遍歷,可以減少遍歷的運算量。

技術分享

int findSecondMinimumValue(struct BSTreeNode *root)
{
    if (root == nullptr)
        return -1;
    int firstMin = root->m_nValue;   //第一小初始化
    int secondMin = 0x7FFFFFFF;  //第二小初始化
    findSecondMinimumValueCore(root, firstMin, secondMin);
    if (secondMin == 0x7FFFFFFF)  //如果沒有第二小的值,secondMin未賦值,給出-1
return -1; return secondMin; } void findSecondMinimumValueCore(struct BSTreeNode *root,int firstMin,int& secondMin) { // 前序遍歷 int value = root->m_nValue; if (firstMin<value && secondMin>value) secondMin = value; if (root->m_pLeft && root->m_pLeft->m_nValue<secondMin)
// 剪枝,因為每一個節點的值小於等於它的子節點的值,如果該節點大於等於secondMin的值,則無需遍歷,需要做剪枝提高效率 findSecondMinimumValueCore(root->m_pLeft, firstMin, secondMin); if(root->m_pRight && root->m_pRight->m_nValue<secondMin) findSecondMinimumValueCore(root->m_pRight, firstMin, secondMin); }

  完整的C++源代碼: https://github.com/wylloong/TinyPrograms/blob/master/Coding%20Interviews/FindSecondMinValue.cpp

找出該樹中第二小的值--思路及算法實現