给定二叉树的根节点 root,找出存在于不同节点 A和 B 之间的最大值V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。

给定二叉树的根节点 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);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值