【二叉树】求最大叶子间距

大致思路:

根据举例子模拟找规律,发现需要去对每个结点求“左子树高度+右子树高度”,如左图=1+1=2是最大的,右图2+2=4是最大的。

这里容易只求根节点的,但如右图这种情况,其实要对每个结点求,取最大值。

实现上,我是定义BTNode结构体(left和right都是指针),然后求高度就是递归来做,同时在函数中更新高度和的最大值。别人题解里是只有int left;int right;,原因是发现样例输入里其实输入的就是结点编号,从而无需结点的val。

AC代码:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;

struct BTNode
{
	int val;
	BTNode* left;
	BTNode* right;
	BTNode(int x):val(x),left(NULL),right(NULL){}
};

int maxx = -1;
int cal_depth(BTNode* root)
{
	if(root==NULL)
		return -1; //根据题意样例模拟了下,这里要设-1 
	int l_depth=cal_depth(root->left)+1;
	int r_depth=cal_depth(root->right)+1;
	int sum = l_depth + r_depth;
	maxx = max(maxx, sum);
	return max(l_depth,r_depth);
}

queue<BTNode*>q;
queue<BTNode*>store;
int main()
{
	int n;
	cin>>n;
	BTNode* root = new BTNode(0);
	q.push(root); //根节点 
	store.push(root);
	while(q.size()!=0)
	{
		BTNode *p = q.front();
		q.pop();
		int leftVal,rightVal;
		scanf("%d",&leftVal);
		scanf("%d",&rightVal);
		BTNode* left = new BTNode(leftVal);
		BTNode* right = new BTNode(rightVal);
		if(leftVal!=-1)
		{
			p->left=left;
			q.push(left);
			store.push(left);
		}
		if(rightVal!=-1)
		{
			p->right=right;
			q.push(right);
			store.push(right);
		}
	}
	while(store.size()!=0) //对每个结点
	{
		BTNode *p=store.front();
		store.pop();
		cal_depth(p);
	}
	cout<<maxx<<endl;
	return 0;
}

别人的AC代码:

#include <cstdio>
 
const int maxn = 100;
struct node{
    int right, left;
}Node[maxn];
int maxd;
 
int MaxDistance(int root, int &maxd){
    if(root == -1){        //如果遇到空节点,以它为根的子树高度为-1
        return -1;
    }
    int lefth = MaxDistance(Node[root].left, maxd) + 1;
    int righth = MaxDistance(Node[root].right, maxd) + 1;
    if(maxd < lefth + righth){
        maxd = lefth + righth;    //不断更新最大间距
    }
    return lefth > righth ? lefth : righth;      //返回的是当前节点为根的子树高度
}
 
int main(){
    int n, left, right;
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        scanf("%d %d", &left, &right);
        Node[i].left = left;
        Node[i].right = right;
    }
    MaxDistance(0, maxd);
    printf("%d\n", maxd);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值