題目:
有一棵二叉樹,樹上每個點標有權值,權值各不相同,請設計乙個演算法算出權值最大的葉節點到權值最小的葉節點的距離。二叉樹每條邊的距離為1,乙個節點經過多少條邊到達另乙個節點為這兩個節點之間的距離。
給定二叉樹的根節點root,請返回所求距離。
這道題注意是最大的葉子節點到最小的葉子節點的距離。葉子節點是沒有左右孩子的節點。
1 #include 2 #include 3 #include4 #include 5 #include 6 #include 7 #include 8
using
namespace
std;910
struct
treenode
15};
1617
//以前序遍歷建立二叉樹
18void createbitree(treenode **t)//
*t是指向bitnode的指標
1933}34
35/*
36分兩大步
371 標記每個節點的父節點,並且找出最大葉節點和最小葉節點
38用map>標記每個子節點的父節點,first是子節點值,second是《父節點值,父節點位置》
39用queue遍歷二叉樹的節點
40依次把每個父節點的子節點push進佇列,每取出乙個節點處理,計數加1,然後處理取出節點的左右孩子進行標記
41處理完之後,把取出的節點pop出去
422 計算兩個葉節點的最短路徑
43分別找出兩個葉節點到樹根的路徑,公共部分以前的路徑相加即最短路徑
44*/
45class
tree
69if (temp->right)//
如果該節點有右孩子,標記右孩子,並且把右孩子入佇列
7074
if (temp->left == null &&temp->right == null)//
如果該節點是葉子節點,需要比較它和max和min的大小
7581
que.pop();82}
83//
第2步84 vectorv1;
85 vectorv2;
86v1.push_back(min);
87v2.push_back(max);
88int move1 =min;
89int move2 =max;
90while(parent[move1].second > 0)//
把min到樹根的路徑找出來
9195
while (parent[move2].second > 0)//
把max到樹根的路徑找出來
96100
//反轉一下方便查詢公共串,第乙個節點都是樹根
101reverse(v1.begin(), v1.end());
102reverse(v2.begin(), v2.end());
103int n = 0
;104
for (;v1[n] == v2[n];n++);//
n是公共串的結尾
105return (v1.size() + v2.size() - 2 *n);
106}
107};
108109
//測試
110int
main()
111
網易2016 實習研發工程師 程式設計題 二叉樹
傳送門 有一棵二叉樹,樹上每個點標有權值,權值各不相同,請設計乙個演算法算出權值最大的葉節點到權值最小的葉節點的距離。二叉樹每條邊的距離為1,乙個節點經過多少條邊到達另乙個節點為這兩個節點之間的距離。給定二叉樹的根節點root,請返回所求距離。題解 給每個節點編號 0 total 用map記錄每個節...
網易實習生筆試題 二叉樹
題目描述 有一棵二叉樹,樹上每個點標有權值,權值各不相同,請設計乙個演算法算出權值最大的葉節點到權值最小的葉節點的距離。二叉樹每條邊的距離為1,乙個節點經過多少條邊到達另乙個節點為這兩個節點之間的距離。給定二叉樹的根節點root,請返回所求距離。class tree inorder root rig...
網易實習生真題(二叉樹)
2016.3月的網易實習生機試題,考察了的對二叉樹的靈活應用,理解中序遍歷的用處!可能還有優化的解,大家自由發揮!有一棵二叉樹,樹上每個點標有權值,權值各不相同,請設計乙個演算法算出權值最大的葉節點到權值最小的葉節點的距離。二叉樹每條邊的距離為1,乙個節點經過多少條邊到達另乙個節點為這兩個節點之間的...