USTC-CS-2019-E
题目描述
给出一个二叉排序树的层次遍历序列,求从它的一个叶子节点到另一个叶子节点的路径,要求路径上经过节点的数值之和最大。
输入描述
输入为一行,包含节点1-n的数值(2≤n≤100)。
输出描述
输出最大的数值之和。
样例输入
25 15 40 5 20 30 50 10 35
样例输出
165
思路描述
建立二叉搜索树,然后深度优先搜索求
求解代码
#include<iostream>
using namespace std;
struct Node{
int data;
Node* lchild; // 左孩子
Node* rchild; // 右孩子
Node* parent;
};
void insert(Node* &root,Node* parent,int data){
if(root == NULL){
Node* newNode = new Node();
newNode->data = data;
newNode->lchild = NULL;
newNode->rchild = NULL;
root = newNode;
root->parent = parent;
}
else if(data < root->data){
insert(root->lchild,root,data);
}
else if(data>root->data){
insert(root->rchild,root,data);
}
}
int max(int data1,int data2){
return data1 > data2?data1:data2;
}
int max_sum = 0;
int dfs(Node* root){
if(root == NULL){
return 0;
}
int val1 = root->data + dfs(root->lchild);
int val2 = root->data + dfs(root->rchild);
int val3 = val1+val2 - root->data;
if(max_sum<val3){
max_sum = val3;
}
return max(val1,val2);
}
/*void order(Node* root){
if(root != NULL){
cout<<root->data<<endl;
order(root->lchild);
order(root->rchild);
}
建树是否成功测试代码
}*/
int main(){
int m;
Node* root = NULL;
while(cin>>m){
insert(root,NULL,m);
}
dfs(root);
cout<<max_sum<<endl;
}