【樹】B040_LC_節點與其祖先之間的最大差值(後序遍歷)

一、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;
    }
};

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(1)O(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章