二叉樹:距離最近的共同祖先

客院載論發表於2020-12-07

問題描述 :

  • 目的:使用C++模板設計二叉樹的抽象資料型別(ADT)。並在此基礎上,使用二叉樹ADT的基本操作,設計並實現簡單應用的演算法設計。

  • 內容:(1)請參照連結串列的ADT模板,設計二叉樹的抽象資料型別。(由於該環境目前僅支援單檔案的編譯,故將所有內容都集中在一個原始檔內。在實際的設計中,推薦將抽象類及對應的派生類分別放在單獨的標頭檔案中。參考教材、課件,以及網盤中的連結串列ADT原型檔案,自行設計二叉樹的ADT。)

  • 注意:二叉樹ADT的基本操作的演算法設計很多要用到遞迴的程式設計方法。

  • (2)ADT的簡單應用:使用該ADT設計並實現若干應用二叉樹的演算法設計。

  • 應用:要求設計一個演算法,查詢距離二叉樹中2個結點最近的共同祖先。二叉樹的儲存結構的建立參見二叉樹應用1。

  • 注意:x、y都是屬於該二叉樹的結點。

參考函式原型:

//查詢距離二叉樹中2個結點最近的共同祖先 (使用者函式)

template<class ElemType>

BinaryTreeNode<ElemType> * FindNearAncient( BinaryTree<ElemType> &T, ElemType &x, ElemType &y );     

輔助函式:

//查詢從根結點到元素值為x的結點的路徑 (成員函式,參見基本操作18)

template<class ElemType> //Q為存放路徑的順序佇列

void BinaryTree<ElemType>::FindPath( ElemType &x, SqQueue<BinaryTreeNode<ElemType> *> &Q );

輸入說明 :

第一行:表示無孩子或指標為空的特殊分隔符

第二行:二叉樹的先序序列(結點元素之間以空格分隔)

第三行:元素值x

第四行:元素值y

輸出說明 :

第一行:元素值(共同祖先)

如x、y中有根結點,則輸出NULL

輸入範例 :

#
A B # C D # # E # # F # G # H # #
B
D

輸出範例 :

A

思路分析

在這裡插入圖片描述

  • 將問題轉換為找兩個字串的公共子串的最後一個元素

實現偽碼

BinaryTreeNode * FindNearAncient( BinaryTree T
                                           , ElemType x, ElemType y ){

    //樹為空,就退出
    if(T.BinaryTreeisEmpty()) return NULL;

    //建造兩個佇列用來儲存二者的路徑
    SqQueue<BinaryTreeNode*> xQueue,yQueue;

    //生成二者的路徑的
    T.FindPath(x,xQueue);
    T.FindPath(y,yQueue);

    //遍歷兩個佇列,找對最後一個公共字首
    BinaryTreeNode *xNode,*yNode;
    xQueue.deQueue(xNode);
    yQueue.deQueue(yNode);

    //遍歷兩個佇列
    while(xNode->getData() != yNode->getData()){

        //首先佇列不是等長的,長的先出
        if(xQueue.getQueueNums() > yQueue.getQueueNums()){
             xQueue.deQueue(xNode);
        }
        else if(xQueue.getQueueNums() < yQueue.getQueueNums()){
            yQueue.deQueue(yNode);

        }else{
            xQueue.deQueue(xNode);
            yQueue.deQueue(yNode);

        }
    }

    //裡面還有一個節點可以出隊
    if(xQueue.getQueueNums() >= 1)
    {
        xQueue.deQueue(xNode);
        return xNode;

    }else{
        return NULL;

    }
}

事故現場

第一次提交

在這裡插入圖片描述

  • 我試了很多,但離奇的是,居然都通過了,所以,毫不猶豫地買了樣例
    在這裡插入圖片描述
  • 半截題目沒有看清,行吧,認了。

分析總結

  • 題目沒有申請,所以,還剩很多,用盡洪荒之力,接著寫吧

如果不妥,請在評論區留言,或者加我的扣扣一起討論學習,651378276

相關文章