有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。
#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
class Node{
public:
int val;
Node *left, *right;
Node(){right = NULL; left = NULL;}
Node(int x) :
val(x), left(NULL), right(NULL) {
}
};
Node* build(Node* root, int val){
if(root == NULL){
root = new Node();
root->val = val;
return root;
}
if(val < root->val) root->left = build(root->left, val);
else if(val > root->val) root->right = build(root->right, val);
return root;
}
void levelOrder(Node* root){
queue<Node*> q;
q.push(root);
while(!q.empty()){
Node *temp = q.front();
q.pop();
cout<<temp->val<<" ";
if(temp->left) q.push(temp->left);
if(temp->right) q.push(temp->right);
}
}
//先序遍历
void preorder(Node* root){
if(root!=NULL){
//visit(root.getData());
cout<<root->val<<endl;
preorder(root->left);
preorder(root->right);
}
}
//中序遍历
void inorder(Node* root){
if(root!=NULL){
inorder(root->left);
//visit(root.getData());
cout<<root->val<<endl;
inorder(root->right);
}
}
//后序遍历
void afterorder(Node* root){
if(root!=NULL){
afterorder(root->left);
afterorder(root->right);
//visit(root.getData());
cout<<root->val<<endl;
}
}
Node* maxNode = new Node(-1);
//maxNode->val=-1;
Node* minNode = new Node(1000000);
//minNode->val=1000000;
Node* lcaNodes=new Node();
void getMaxMin(Node* root) {
if(root == NULL){
return;
}
// if(root->left == NULL && root->right == NULL){
// if(root->val > maxNode->val){
// maxNode = root;
// }else if(root->val < minNode->val){
// minNode = root;
// }
// }
if(root->val > maxNode->val){
maxNode = root;
}
if(root->val < minNode->val){
minNode = root;
}
// if(root->val ==4){
// maxNode = root;
// }
// if(root->val == 2){
// minNode = root;
// }
getMaxMin(root->left);
getMaxMin(root->right);
}
Node* getLCA(Node* root) {
if(root == NULL){
return NULL;
}
if(root->val == maxNode->val || root->val == minNode->val){
return root;
}
Node* leftNode = getLCA(root->left);
Node* rightNode = getLCA(root->right);
// if(leftNode != NULL&&rightNode != NULL){
// lcaNodes=root;
// }
if(leftNode == NULL){
return rightNode;
}else if(rightNode == NULL){
return leftNode;
}else{
return root;
}
}
int getNodeDis(Node* lcaNode, Node* node) {
if(lcaNode == NULL){
return -1;
}
if(lcaNode->val == node->val){
return 0;
}
int distance = getNodeDis(lcaNode->left,node);
if(distance == -1){
distance = getNodeDis(lcaNode->right,node);
}
if(distance !=-1){
return distance+1;
}
return -1;
}
int getDis(Node* root){
getMaxMin(root);//找到最大最小叶子节点->val<<ednl;
cout<<maxNode->val<<endl;
cout<<minNode->val<<endl;
Node* lcaNode = getLCA(root);//find LCA
//getLCA(root);
cout<<lcaNode->val<<endl;
int a = getNodeDis(lcaNode,maxNode);
int b = getNodeDis(lcaNode,minNode);
cout<<a<<endl;
cout<<b<<endl;
return a+b;
}
int main(){
Node *root = NULL;
//vector v;
//v.push_back()
int t[] = {5,3,6,4,7,8,2};
for(int i = 0; i < 7; i++) root = build(root, t[i]);
//levelOrder(root);
int distance=getDis(root);
cout<<distance<<endl;
//preorder(root);
return 0;
}