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