歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

求二叉樹中任意兩個節點之間的距離,遞歸和非遞歸

1、二叉樹定義

typedef struct BTreeNodeElement_t_ {
    void *data;
} BTreeNodeElement_t;


typedef struct BTreeNode_t_ {
    BTreeNodeElement_t    *m_pElemt;
    struct BTreeNode_t_    *m_pLeft;
    struct BTreeNode_t_    *m_pRight;
} BTreeNode_t;

2、二叉樹中任意兩個節點之間的距離

根本上是求二叉樹中任意兩個節點的最近祖先節點(最近公共父節點),求出最近祖先節點之後,由最近祖先節點到這兩個節點的距離之和就是。

(1)遞歸方式

首先根據遞歸方式求出最近祖先節點;

然後根據遞歸方式,從最近祖先節點通過前序遍歷方式遍歷到給定節點,找到路徑,同時計算出距離即可(本處距離可以認為是兩節點之間的邊可以看成是單位1)

(2)非遞歸方式

int GetLenBetweenNodes( BTreeNode_t *pRoot, BTreeNode_t *pNode1, BTreeNode_t *pNode2){
    if( pRoot == NULL || pNode1 == NULL || pNode2 == NULL )
        return 0;
    if( pNod1 == pNod2 )
        return 0;
   
    vector <BTreeNode_t *>  vec1;
    vector <BTreeNode_t *>  vec2;
    stack <BTreeNode_t *>  st;

    bool findNod1 = false;
    bool findNod2 = false;
    int len = 0;

    while( !st.empty() || pRoot != NULL  ){//前序遍歷,找到從根節點到給定節點的路徑
        while( pRoot != NULL ){
            if( findNod1 == false){
                vec1.push_back( pRoot);
                if( pRoot == pNode1)
                    findNod1 = true;
            }
            if( findNod2 == false){//沒有找到完整路徑,就增加節點
                vec2.push_back( pRoot);
                if( pRoot == pNode2 )
                    findNod2 = true;
            }

            if( findNod1 && findNod2 )//都已找到,退出查找
                break;

            st.push(pRoot);
            pRoot = pRoot->m_pLeft;
        }

        if( !st.empty() ){
            pRoot = st.top();
            st.pop();
            pRoot = pRoot->m_pRight;
            if( findNod1 == false)//路徑錯誤,則刪除節點
                vec1.pop_back();
            if( findNod2 == false)
                vec2.pop_back();
        }
        if( findNod1 && findNod2 )//都已找到,退出查找
            break;
    }

    if( findNod1 && findNod2){
        vector <BTreeNode_t *> :: iterator  iter1 = vec1.begin();
        vector< BTreeNode_t *> :: iterator iter2 = vec2.begin();
        BTreeNode_t *lastCommonParent = NULL;
        int commonSize = 0;
        while( iter1 != vec1.end() && iter2 != vec2.end() ){//同時從根節點開始,遍歷兩個路徑,找到最低祖先節點,並記錄從根節點到最低祖先節點的長度
            if( *iter1 == *iter2 ){
                lastCommonParent = *iter1;
                ++commonSize;
            }
            else
                break;
        }
        len = vec1.size() + vec2.size() - 2*commonSIze;//兩個路徑長度-兩個共同長度,就是最終距離
    }

    vec1.clear();
    vec2.clear();
    st.clear();

    return len;
}

二叉樹的常見問題及其解決程序 http://www.linuxidc.com/Linux/2013-04/83661.htm

【遞歸】二叉樹的先序建立及遍歷 http://www.linuxidc.com/Linux/2012-12/75608.htm

在JAVA中實現的二叉樹結構 http://www.linuxidc.com/Linux/2008-12/17690.htm

【非遞歸】二叉樹的建立及遍歷 http://www.linuxidc.com/Linux/2012-12/75607.htm

二叉樹遞歸實現與二重指針 http://www.linuxidc.com/Linux/2013-07/87373.htm

二叉樹先序中序非遞歸算法 http://www.linuxidc.com/Linux/2014-06/102935.htm

輕松搞定面試中的二叉樹題目 http://www.linuxidc.com/linux/2014-07/104857.htm

Copyright © Linux教程網 All Rights Reserved