二叉树两个结点的距离是一个结点经过双亲结点,祖先结点等中间结点到达另一个结点经过的分支数。二叉树结点的最大距离是所有结点间距离的最大值。例如,下图所示二叉树结点最大距离是3,C和D的距离。
二叉树用先序遍历顺序创建,#表示空树。计算二叉树结点最大距离和最大距离的两个结点(假设二叉树中取最大距离的两个结点唯一)。
标签:out create 假设 creat 中间 eof 距离 表示 EDA
二叉树两个结点的距离是一个结点经过双亲结点,祖先结点等中间结点到达另一个结点经过的分支数。二叉树结点的最大距离是所有结点间距离的最大值。例如,下图所示二叉树结点最大距离是3,C和D的距离。
二叉树用先序遍历顺序创建,#表示空树。计算二叉树结点最大距离和最大距离的两个结点(假设二叉树中取最大距离的两个结点唯一)。
测试次数T
第2行之后的T行,每行为一棵二叉树先序遍历结果(#表示空树)
对每棵二叉树,输出树的结点最大距离和最大距离的结点,输出格式见样例。
#include<iostream> #include<string> #include<cstring> using namespace std; int M[100]; char L[100]; char R[100]; int I=0; class BiTreeNode { public: char data; BiTreeNode *Left; BiTreeNode *Right; BiTreeNode() { Left=NULL; Right=NULL; } ~BiTreeNode() { delete Left; delete Right; } }; class BiTree { public: BiTreeNode *Root; int pos; string strTree; int deep; int leftdeep; int rightdeep; char leftc; char rightc; char c; int maxx; BiTree(string str) { pos=0; deep=0; leftdeep=0; rightdeep=0; maxx=0; strTree=str; Root=CreateBiTree(); } BiTreeNode *CreateBiTree() { char ch=strTree[pos]; pos++; if(ch==‘#‘) { return NULL; } else { BiTreeNode *T; T=new BiTreeNode(); T->data=ch; T->Left=CreateBiTree(); T->Right=CreateBiTree(); return T; } } void countleftdeep(BiTreeNode *p) { if(p->Left==NULL) { leftdeep=0; leftc=p->data; return; } p=p->Left; countdeep(p,0); leftdeep=deep; leftc=c; return; } void countrightdeep(BiTreeNode *p) { if(p->Right==NULL) { rightdeep=0; rightc=p->data; return; } else p=p->Right; countdeep(p,0); rightdeep=deep; rightc=c; return; } void countdeep(BiTreeNode *p,int i) { if(p) { i++; if(p->Left==NULL&&p->Right==NULL) { if(deep<i) { deep=i; c=p->data; } } countdeep(p->Left,i); countdeep(p->Right,i); } } void pre(BiTreeNode *p)// { if(p!=NULL) { deep=0; countleftdeep(p);// deep=0; countrightdeep(p);// deep=0; maxx=leftdeep+rightdeep; M[I]=maxx; L[I]=leftc; R[I]=rightc; I++; pre(p->Left); pre(p->Right); } } }; int main() { int T; cin>>T; while(T--) { for(int i=0;i<I;i++) M[i]=0; memset(L,0,sizeof(L)); memset(R,0,sizeof(L)); I=0; string str; cin>>str; BiTree tree(str); tree.pre(tree.Root); int m=M[0]; int index=0; for(int i=0;i<I;i++) { if(M[i]>m) index=i; } cout<<M[index]<<":"; if(M[index]!=0) cout<<L[index]<<" "<<R[index]<<endl; else cout<<endl; } return 0; }
标签:out create 假设 creat 中间 eof 距离 表示 EDA
原文地址:https://www.cnblogs.com/SZU-DS-wys/p/12180810.html