//题目:求二叉树中结点的最大距离(距离:为两节点之间边的个数)
//思路:情况A:路径经过左子树的最深结点,通过根节点,再到右子树的最深结点。
// 情况B:路径不经过根节点,而是左子树或右子树的最大距离,取其大者。
//此问题的核心是,情况A和B需要不同的信息:A需要子树的最大深度,B需要子树的最大距离。
//只要函数能在一个节点同时计算及返回这两个信息即可。
#include<iostream>
using namespace std;
typedef struct BiTreeNode
{
int data;
BiTreeNode* lchild;
BiTreeNode* rchild;
BiTreeNode(int x) : data(x), lchild(NULL), rchild(NULL) {}
};
typedef struct Result//返回结果
{
int maxDistance;//最大距离
int maxDepth;//最大深度
};
Result GetMaxiumDistance(BiTreeNode *root)
{
if(!root)
{
Result empty={0,-1};//最大深度初始化为-1,是应为调用者要对其加1,然后变为0
return empty;
}
Result lhs = GetMaxiumDistance(root->lchild);
Result rhs = GetMaxiumDistance(root->rchild);
Result result;
result.maxDistance = max(max(lhs.maxDistance,rhs.maxDistance),lhs.maxDepth+rhs.maxDepth+2);//最大距离
result.maxDepth = max(lhs.maxDepth+1,rhs.maxDepth+1);//最大深度
return result;
}
//***********测试代码************
// 1
// /
// 2
// /\
// 4 5
// \
// 3
void main()
{
//生成第一棵树
BiTreeNode* Node1 = new BiTreeNode(1);//生成节点
BiTreeNode* Node2 = new BiTreeNode(2);
BiTreeNode* Node3 = new BiTreeNode(3);
BiTreeNode* Node4 = new BiTreeNode(4);
BiTreeNode* Node5 = new BiTreeNode(5);
BiTreeNode* Node6 = new BiTreeNode(6);
BiTreeNode* Node7 = new BiTreeNode(7);
Node1->lchild=Node2;//连接节点
Node2->lchild=Node4;
Node2->rchild=Node5;
Node5->rchild=Node3;
Result result = GetMaxiumDistance(Node1);
cout<<result.maxDistance<<endl;
}
求二叉树中结点的最大距离
最新推荐文章于 2022-06-10 18:00:53 发布