求二叉樹中任意兩結點的距離

2021-06-18 14:45:36 字數 2953 閱讀 3228

與該題的一道相似題為:求二叉樹中結點的最長距離。兩題看似有聯絡,但是做法不同。

分析:距離和深度之間存在必然聯絡。如果已知最長距離的兩結點的最低公共根節點r

,那麼我們求r

的左右子樹深度相加即最長距離求出。如下圖所示:

我們發現a和b是最長距離,他們的最低公共根節點為c,假如我們知道c的左右子樹高度均為3,並且最長路徑通過c,那麼最長路徑必定為3+3=6.因此,問題轉化成求每個結點的左右子樹深度,並取每個結點左右子樹深度和的最大值即可。

因此我們採用result結構體,記錄

以該結點為根的子樹中距離最大值

和該結點的最大深度

。本質還是動態規劃思想。

**如下:

struct binarytreenode

;struct result

;result getmaxdistance(binarytreenode *& proot)

; return empty;

} result leftresult = getmaxdistance(proot->m_pleft);

result rightresult = getmaxdistance(proot->m_pright);

result result;

result.nmaxdepth = 1+ max(leftresult.nmaxdepth, rightresult.nmaxdepth);

result.nmaxdistance =max( max(leftresult.nmaxdistance, rightresult.nmaxdistance), (leftresult.nmaxdepth+rightresult.nmaxdepth+2) );

return result;

}

建樹**參考:

// 輸入:先序和中序的第乙個指標和最後乙個指標,  

// 遞迴呼叫,每次缺點當前結點

binarytreenode* constructcore(char* startperorder, char* endpreorder, char* startinorder, char* endinorder)

// 在中序遍歷中找到根節點的值

char* rootinorder = startinorder;

while(rootinorder<=endinorder && *rootinorder!=rootvalue)

++rootinorder;

//異常處理

if ( rootinorder==endinorder && *rootinorder!=rootvalue)

throw std::exception("invalid input.");

int leftlength = rootinorder - startinorder;

char* leftpreorderend = startperorder+leftlength;

if ( leftlength > 0 )

if ( leftlength < endpreorder-startperorder )

return root;

} //根據先序和中序構建二叉樹

binarytreenode* construct(char* preorder, char* inorder, char length)

int _tmain(int argc, _tchar* argv)

; //開闢乙個指標陣列,指向兩個字元的路徑

while ( ptempnode || !path.empty() ) //當所有結點都遍歷完或者已經找到二者的路徑則終止

pnodepath[nfindcount++][i] = '\0';

if (nfindcount==2)

break;

}ptempnode = ptempnode->m_pleft;

} while ( !path.empty() && tag[path.size()-1] == true ) //如果棧頂元素左右子樹已遍歷完在遍歷該結點

}//如果二者不全有值,距離預設為0

if ( !(pnodepath[0]&&pnodepath[1]) )

return 0;

//遍歷兩結點路徑字串,不相同字元個數即二者的路徑長度

char *p1 = pnodepath[0];

char *p2 = pnodepath[1];

int distance = 0;

while ( *p1!='\0' || *p2!='\0' )

else

if (*p2 != '\0')

}} delete pnodepath[0];

delete pnodepath[1];

return distance;

}int _tmain(int argc, _tchar* argv){

char* pinorder = "abcdefghi";

char* ppreorder = "ecbadhfgi";

binarytreenode* proot = construct( ppreorder,pinorder,strlen(pinorder) );

cout << getdistancebetnodes(proot, 'a', 'e') 那麼,在一棵多叉樹中同時找多個結點文字值的最低公共祖先結點,方法也是一樣的。即後序遍歷,先序處理

求二叉樹中任意兩個結點的距離

實現步驟 計算跟到第乙個結點的距離 計算跟到第二個結點的距離 計算lca 計算跟到lca結點的距離 結果為 1 2 2 4 因為重複計算了兩次的從跟到lca結點的距離 class node object def init self value 0 self value value self left...

求二叉樹中結點的最大距離

距離 是兩結點之間邊的個數。求最大距離存在兩種情況,一是路徑經過左子樹的最深結點,通過根結點,再到右子樹的最深結點。二是不穿過根結點,二是左子樹或右子樹的最大距離路徑中,取其大者。問題的核心在於兩種不同的情況需要不同的資訊,一是需要子樹的最大深度,二是需要子樹的最大距離。遞迴 如下 先序遍歷輸入用例...

求二叉樹中任意兩個結點間的路徑(C )

include include using namespace std struct node void getnodepath node root,node node,vector v,bool flag 用後根遍歷的方式尋找node,找到後儲存從該節點到根節點的路徑 node creattree...