與該題的一道相似題為:求二叉樹中結點的最長距離。兩題看似有聯絡,但是做法不同。
分析:距離和深度之間存在必然聯絡。如果已知最長距離的兩結點的最低公共根節點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...