给定二叉树的根节点 root,找出存在于不同节点 A和 B 之间的最大值V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。
输入
输入一行,按照先序输入一棵二叉树,其中空节点用 -1 表示。
输出
输出一行代表最大差值V。
样例输入
8 3 1 -1 -1 6 4 -1 -1 7 -1 -1 10 -1 14 13 -1 -1 -1
样例输出
7
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode
{
int data;
struct BiTNode* lchild, *rchild;
}BiTNode, *BiTree;
BiTree creat()
{
BiTree root = (BiTree)malloc(sizeof(BiTNode));
int x;
scanf("%d", &x);
if(x==-1)
root = NULL;
else
{
root->data = x;
root->lchild = creat();
root->rchild = creat();
}
return root;
}
int max, min;
void max_min(BiTree p)
{
if(p != NULL)
{
if(p->lchild != NULL && max < p->lchild->data)
max = p->lchild->data;
if(p->rchild != NULL && max < p->rchild->data)
max = p->rchild->data;
if(p->lchild != NULL && min > p->lchild->data)
min = p->lchild->data;
if(p->rchild != NULL && min > p->rchild->data)
min = p->rchild->data;
max_min(p->lchild);
max_min(p->rchild);
}
}
int dif[100];
void difference(BiTree root, int no)
{//no为层次遍历序列下结点的编号,根结点编号为0
if(root != NULL)
{
max = root->data;
min = root->data;
max_min(root);
int k = root->data;
if(k > min)
{//如果根结点不是最小值,则比较(最大值-根结点值)与(根结点值-最小值)的大小
if(max-k>k-min)
dif[no] = max-k;
else
dif[no] = k-min;
}
else //如果根节点是最小值,则最大的差值为(最大值-根结点值)
dif[no] = max-k;
difference(root->lchild, no+1);
difference(root->rchild, no+2);
}
else
dif[no] = 0;
}
int main()
{
BiTree bt = creat();
// print(bt);
for(int i=0;i<100;i++)
dif[i] = -1;
difference(bt,0);
int V=0;
for(int i=0; dif[i]!=-1; i++)
if(V<dif[i])
V = dif[i];
printf("%d\n", V);
}