来源:力扣
题目描述:
给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。
(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)
从根开始进行 DFS。DFS 时记录路径上的最小值和最大值,每次进入下一个节点时,更新这两个值和这两个值的差值。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)
{
return a>b?b:a;
}
void dfs(int maxn,int mini,int *ans,struct TreeNode *p)//ans要保持更新,所以用指针传入
{
maxn=max(maxn,p->val);
mini=min(mini,p->val);
*ans=max(*ans,maxn-mini);
//printf("max=%d min=%d ans=%d\n",maxn,mini,*ans);
if(p->left)dfs(maxn,mini,ans,p->left);
if(p->right)dfs(maxn,mini,ans,p->right);
}
int maxAncestorDiff(struct TreeNode* root){
int maxn=-1,mini=100010,ans=0;
dfs(root->val,root->val,&ans,root);
return ans;
}