您的位置:首页 > 其它

二叉树中权值最大的叶节点到权值最小的叶节点的距离

2016-04-02 21:11 288 查看
有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。给定二叉树的根节点root,请返回所求距离。
解析:首先求出二叉树中所有从根节点到叶子节点的路径,存储在vector<vector<int>> allPath中。然后找到权值最大的叶子节点和权值最小的叶子节点所在的路径所在的路径的编号。该问题可以转换为两个节点到最低公共祖先的距离问题。
#include<iostream>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;

//树节点结构
struct TreeNode
{
TreeNode *left;
TreeNode *right;
int val;
};

//创建二叉树
void createTree(TreeNode* &root)
{
int val;
cin >> val;
if (val != -1)
{
root = new TreeNode;
root->val = val;
root->left = NULL;
root->right = NULL;
createTree(root->left);
createTree(root->right);
}
}

class Tree {
public:
//求距离函数
int getDis(TreeNode* root) {
getPath(root);
int minIndex = 0;//叶子节点权值最小的路径编号
int maxIndex = 0;//叶子节点权值最大的路径编号
for (int i = 1; i < allPath.size(); ++i)
{
if (allPath[i].back() < allPath[minIndex].back())
minIndex = i;
if (allPath[i].back() > allPath[maxIndex].back())
maxIndex = i;
}

//最低公共祖先节点的权值
int pos = 0;
while (allPath[minIndex][pos] == allPath[maxIndex][pos])
{
pos++;
}
//叶子节点权值最小(最大)到最低公共祖先的距离
int val = allPath[minIndex].size() + allPath[maxIndex].size() - 2 * pos;
return val;
}

//得到所有的路径
void getPath(TreeNode *root)
{
if (root == NULL)
return;
if (root->left == NULL && root->right == NULL)
{
path.push_back(root->val);
allPath.push_back(path);
}
else
{
path.push_back(root->val);
if (root->left)
getPath(root->left);
if (root->right)
getPath(root->right);
}
path.pop_back();
}
vector<vector<int>> allPath;
vector<int> path;
};

int main(void)
{
TreeNode *root = NULL;
createTree(root);
Tree t;
t.getPath(root);
cout << t.getDis(root) << endl;
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: