写一个函数,能找出该节点往下的层数最多是多少
然后遍历,对节点的左右节点往下的层数分别最多是多少,加起来
然后找出最多的那个
这里容易知道对应的俩个点都是子叶
不一定中间节点在头节点,比如样例的第三个,
这个用来记录层数和子叶的数据,找到子叶然后返回一个Date 类
到底了返回数值0 ,从子叶开始向上返回每次加一后的值,和子叶的数据
遍历,每个节点都找左右然后加起来和longest比较,如果比他大,那需要
改longest,和最远距离对应的那对
#include <iostream>
using namespace std;
int longest=0;//记录最远距离
char leftchar;//记录最远距离的一对中的左
char rightchar;
class BiTreeNode;
class Date{
public:
int t;
char ch;
Date(int t,char ch){
this->t=t;
this->ch=ch;
}
};
class BiTreeNode{
public:
char date;
BiTreeNode *leftchild;
BiTreeNode *rightchild;
};
class BiTree{
public:
BiTreeNode *Root; //根节点指针
int pos;
string strTree;
BiTreeNode *CreateBirtree();
void PreOrder(BiTreeNode *t);
void InOrder(BiTreeNode *t);
void PostOrder(BiTreeNode *t);
public:
BiTree(){}
~BiTree(){}
void CreateTree(string TreeArray);//利用先序遍历结果创建二叉树
void PreOrder()//前序遍历
{
PreOrder(Root);
}
Date findheight(BiTreeNode *t);
};
void BiTree::CreateTree(string TreeArray){
pos=0;
strTree.assign(TreeArray);
Root=CreateBirtree();
}
//递归建树,私有函数,类内实现
BiTreeNode* BiTree::CreateBirtree(){
BiTreeNode *T;
char ch;
ch=strTree[pos++];
if(ch=='#') T=NULL;
else{
T=new BiTreeNode();
T->date=ch;// 生成根节点
T->leftchild=CreateBirtree();// 构造左子树
T->rightchild=CreateBirtree();//构造右子树
}
return T;
}
// 定义先序遍历函数
void BiTree ::PreOrder(BiTreeNode *t) {
if(t!=NULL){
Date left=findheight(t->leftchild);
if(left.t==0)
left.ch=t->date;
Date right= findheight(t->rightchild);
if(right.t==0)
right.ch=t->date;
int sum=left.t+right.t;
if(sum>longest){
longest=sum;
leftchar=left.ch;
rightchar=right.ch;
}
PreOrder(t->leftchild);
PreOrder(t->rightchild);
}
}
Date BiTree ::findheight(BiTreeNode *t) {
//若节点t不空,执行以下操作
if(t!=NULL){
Date left=findheight(t->leftchild);
Date right=findheight(t->rightchild);
if(left.t+right.t==0){//到底了,从这里是第一层
return Date{1,t->date};
}
if(left.t>right.t){
return Date{1+left.t,left.ch};
}
if(right.t>left.t){
return Date{1+right.t,right.ch};//算上本身一层所以要加一
}
}
return Date{0,'0'};//t=NULL 的情况
}
int main()
{
int t;cin>>t;
for (int i = 0; i < t; ++i) {
longest=0;//每次都需要更新为0
string str;cin >> str;
BiTree *tree;
tree = new BiTree();
tree->CreateTree(str);
tree->PreOrder();
cout<<longest<<":";
if(longest!=0)
cout<<leftchar<<" "<<rightchar<<endl;
else
cout<<endl;
}
}