#include <iostream>
#include <stdlib.h>
using namespace std;
const int maxsize=100;
int len;
typedef struct BTNode{
char data;
struct BTNode* lChild;
struct BTNode* rChild;
}BTNode,*BiTree;
void creatBiTree(BiTree* bt){
char ch;
scanf("%c",&ch);
if(ch=='#') *bt=NULL;
else{
*bt=(BiTree)malloc(sizeof(BTNode));
(*bt)->data=ch;
creatBiTree(&((*bt)->lChild));
creatBiTree(&((*bt)->rChild));
}
}
void CreatBiTree(BiTree &bt){
char ch;
scanf("%c",&ch);
if(ch=='#') bt=NULL;
else{
bt=new BTNode;
bt->data=ch;
CreatBiTree(bt->lChild);
CreatBiTree(bt->rChild);
}
}
BiTree creatBiTree(){
char ch;
BTNode* bt=NULL;
scanf("%c",&ch);
if(ch=='#') return NULL;
else{
bt=(BiTree)malloc(sizeof(BTNode));
bt->data=ch;
bt->lChild=creatBiTree();
bt->rChild=creatBiTree();
return bt;
}
}
void exchange(BTNode* bt){
if(bt){
BTNode* t=bt->lChild;
bt->lChild=bt->rChild;
bt->rChild=t;
exchange(bt->lChild);
exchange(bt->rChild);
}
}
void preVisit(BTNode* bt){
if(bt){
cout<<bt->data;
preVisit(bt->lChild);
preVisit(bt->rChild);
}
}
void levelVisit(BTNode* bt){
int front=-1,rear=-1;
BTNode* que[maxsize];
BTNode* p;
que[++rear]=bt;
while(front!=rear){
p=que[++front];
cout<<p->data;
if(p->lChild) que[++rear]=p->lChild;
if(p->rChild) que[++rear]=p->rChild;
}
}
int getLevelSize(BTNode* bt,int k){
if(!bt) return 0;
if(k==1) return 1;
return getLevelSize(bt->lChild,k-1)+getLevelSize(bt->rChild,k-1);
}
int getLeafNum(BTNode* bt){
if(!bt) return 0;
if(!bt->lChild&&!bt->rChild) return 1;
return getLeafNum(bt->lChild)+getLeafNum(bt->rChild);
}
int getDepth(BTNode* bt){
if(!bt) return 0;
int ld=getDepth(bt->lChild);
int rd=getDepth(bt->rChild);
return (ld>=rd? ld:rd)+1;
}
int getWidth(BTNode* bt){
int front=-1,rear=-1;
int curnum=0,maxnum=0,last=0;
BTNode* que[maxsize];
BTNode* p;
que[++rear]=bt;
while(front!=rear){
p=que[++front];
curnum++;
if(p->lChild) que[++rear]=p->lChild;
if(p->rChild) que[++rear]=p->rChild;
if(front==last){
maxnum=max(maxnum,curnum);
curnum=0;
last=rear;
}
}
return maxnum;
}
BTNode* findNode(BTNode* bt,char x){
if(!bt) return NULL;
if(bt->data==x)return bt;
BTNode* lnode=findNode(bt->lChild,x);
if(lnode) return lnode;
return findNode(bt->rChild,x);
}
BTNode* getFather(BTNode* bt,char x){
if(!bt) return NULL;
if(!bt->lChild&&!bt->rChild) return NULL;
if(bt->lChild&&bt->lChild->data==x) return bt;
if(bt->rChild&&bt->rChild->data==x) return bt;
BTNode* lfa=getFather(bt->lChild,x);
if(lfa) return lfa;
return getFather(bt->rChild,x);
}
void destoryBiTree(BTNode* bt){
if(!bt) return;
destoryBiTree(bt->lChild);
destoryBiTree(bt->rChild);
delete(bt);
}
int main(){
BTNode* T=NULL;
CreatBiTree(T);
levelVisit(T);
cout<<endl;
cout<<"h="<<getDepth(T)<<endl;
cout<<"w="<<getWidth(T)<<endl;
char x;
cout<<"x=";cin>>x;
BTNode* fa=getFather(T,x);
if(!fa) cout<<"x的双亲节点未找到"<<endl;
else cout<<"fa="<<fa->data<<endl;
return 0;
}