一、Problem
給定二叉樹的根節點 root,找出存在於不同節點 A 和 B 之間的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。
(如果 A 的任何子節點之一爲 B,或者 A 的任何子節點是 B 的祖先,那麼我們認爲 A 是 B 的祖先)
輸入:[8,3,10,1,6,null,14,null,null,4,7,13]
輸出:7
解釋:
我們有大量的節點與其祖先的差值,其中一些如下:
|8 - 3| = 5
|3 - 7| = 4
|8 - 1| = 7
|10 - 13| = 3
在所有可能的差值中,最大值 7 由 |8 - 1| = 7 得出。
提示:
樹中的節點數在 2 到 5000 之間。
每個節點的值介於 0 到 100000 之間。
二、Solution
方法一:後序遍歷
很容易想到通過後序遍歷返回左右子樹的最值,爲什麼是最值呢?因爲求的兩節點之差的絕對值的最大值,
ps:這裏我直接用了 C++ 寫的,感覺真的很方便啊,大愛 C++
class Solution {
public:
int ans;
typedef pair<int, int> pii;
pair<int, int> dfs(TreeNode* root) {
if (root == NULL)
return pair(INT_MAX, INT_MIN);
pii l = dfs(root->left);
pii r = dfs(root->right);
int mi = min({root->val, l.first, r.first});
int ma = max({root->val, l.second, r.second});
ans = max({ans, root->val-mi, ma-root->val});
return pair(mi, ma);
}
int maxAncestorDiff(TreeNode* root) {
dfs(root);
return ans;
}
};
複雜度分析
- 時間複雜度:,
- 空間複雜度:,