歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 求二叉樹中任意兩個節點之間的距離,遞歸和非遞歸

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

日期:2017/3/1 9:34:53   编辑: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