求二叉树最远2结点的距离

二叉树最远两结点之间的距离如下图所示
在这里插入图片描述
在这里插入图片描述
思路:利用二叉树的高度求解此题,就是遍历每个结点,计算该节点左右子树的高度之和,然后就是在这些和当中取最大值即可.

#include <iostream>
using namespace std;
/*
求二叉树最远结点距离
*/

static int max = 0; //记录结果的值

template <class T> //这里用了模板
struct btree {
	T data;
	struct btree<T>* lchild;
	struct btree<T>* rchild;
};

typedef btree<int> btnode;
typedef int mytype;

/*初始化二叉树  输入0为空结点*/
void init(btnode* &root) {
	root = new btnode;
	int num;
	cin >> num;
	if (num) {
		root->data = num;
		init(root->lchild);
		init(root->rchild);
	}
	else {
		root = NULL;
	}
}
/*获得二叉树的深度*/
int getHeight(btnode*& root) {
	if (root) {
		int leftHeight = 0;
		int rightHeight = 0;
		leftHeight = getHeight(root->lchild);
		rightHeight = getHeight(root->rchild);
		return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
	}
	return 0;
}

/*利用前序遍历 求出每个结点左右子树深度之和 求出最大值*/
int getMaxDistance(btnode* &root) {
	if (root) {
		int leftHeight = getHeight(root->lchild);
		int rightHeight = getHeight(root->rchild);
		max = (leftHeight + rightHeight) > max ? (leftHeight + rightHeight) : max;
		getMaxDistance(root->lchild);  //前序遍历
		getMaxDistance(root->rchild);
	}
	else {
		return 0;
	}
}

int main()
{
	btnode* root;
	init(root);

	getMaxDistance(root);
	cout << max;

	return 0;
}

测试用例:
在这里插入图片描述

二叉树中,"最深间隔最远的节点"通常指的是树中最深处的两个节点之间的最大距离。这个概念有时也被称为“深度优先搜索(DFS)的最大跨度”。为了找到这样的两个节点,我们需要执行以下步骤: 1. **计算深度**:对每个节点进行深度计算,可以通过递归的方式从根节点开始,每次移动到左子节点或右子节点时,深度加一,直到遇到空节点。 2. **记录路径**:同时在访问节点的过程中,维护一个当前路径数组,记录下路径上所有节点的索引或位置。 3. **找出最长路径**:遍历完所有节点后,比较每一对相邻节点(即深度相同的节点)的距离,取其中最大的距离作为结果。 4. **确定节点**:最后找到深度最大且间距最大的那对节点,可能是同一侧的两个极端节点,也可能是不同侧面的节点。 下面是一个简单的C语言伪代码示例: ```c struct Node { int value; struct Node* left, *right; }; int maxDepthInterval(struct Node* root) { if (root == NULL) return 0; // 计算深度并存储节点位置 int depth[height], index = 0; dfs(root, 0, depth, &index); // 初始化最大间隔为0 int maxSpan = 0; for (int i = 1; i < height; i++) { for (int j = 0; j <= index - i; j++) { int span = abs(depth[j] - depth[j + i]); if (span > maxSpan) { maxSpan = span; // 更新最远节点的位置 int node1 = depth[j], node2 = depth[j + i]; } } } return maxSpan; } void dfs(struct Node* node, int depth, int* depthArray, int* index) { if (node) { *depthArray[*index++] = depth; dfs(node->left, depth+1, depthArray, index); dfs(node->right, depth+1, depthArray, index); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值