今天见到了之前没有写过的功能,记录一下
//统计树中度为1的结点个数
int numOfOneDegree(BinNode<E>* tmp) {
if(tmp==NULL) return 0;
if(tmp->left()==NULL&&tmp->right()!=NULL) return 1+numOfOneDegree(tmp->right());
if(tmp->left()!=NULL&&tmp->right()==NULL) return 1+numOfOneDegree(tmp->left());
return numOfOneDegree(tmp->right())+numOfOneDegree(tmp->left());
}
//统计树中度为2的结点个数
int numOfTwoDegree(BinNode<E>* tmp) {
if(tmp==NULL) return 0;
if(tmp->left()!=NULL&&tmp->right()!=NULL) return 1+numOfTwoDegree(tmp->right())+numOfTwoDegree(tmp->left());
if(tmp->left()==NULL&&tmp->right()!=NULL) return numOfTwoDegree(tmp->right());
if(tmp->left()!=NULL&&tmp->right()==NULL) return numOfTwoDegree(tmp->left());
}
//交换左右孩子
void exchange(BinNode<E>* tmp) {
if(tmp==NULL) return;
else {
BinNode<E>* l=tmp->left();
tmp->setLeft(tmp->right());
tmp->setRight(l);
}
exchange(tmp->left());
exchange(tmp->right());
}
//计算指定数值x的层数
int findLevel(BinNode<E>* cur,E e,int depth) {
if(cur==NULL) return 0;
if(cur->getValue()==e) return depth;
int l=findLevel(cur->left(),e,depth+1);
if(l>0) return l;
int r=findLevel(cur->right(),e,depth+1);
if(r>0) return r;
return -1;
}
//先序输出结点与层数
void prelevelprint(BinNode<E>* cur,int depth) {
if(cur==NULL) return;
cout<<"结点值:"<<cur->getValue()<<" 层数:"<<depth<<endl;
prelevelprint(cur->left(),depth+1);
prelevelprint(cur->right(),depth+1);
}
//找最每一层最右端的结点并打印值
void printright(BinNode<E>* cur) {
queue<BinNode<E>* > q;
q.push(cur);
while(!q.empty()) {
int size=q.size();
BinNode<E>* right=q.front();
cout<<right->getValue()<<" ";
while(size--) {
BinNode<E>* tmp=q.front();
q.pop();
if(tmp->right()) q.push(tmp->right());
if(tmp->left()) q.push(tmp->left());
}
}
}
/*
根据先序找到根,根据根将先序序列与中序序列划分为左子树部分和右子树部分。
递归地建立左右子树,将根的左右指针指向左右子树
重复该步骤,直到llen=rlen=0即建立完毕
*/
//先序中序建树
template<typename E>
BinBode<E>* PreInCreat(E A[],E B[],int l1,int h1,int l2,int h2) {//第一次调用时l1=l2=1 h1=h2=n
BinNode<E>* root=new BinNode<E>;
root->SetValue(A[l1]); //根结点
int i=0;
for(i=l2;B[i]!=root->getValue();i++)
int llen=i-l2; //左树长度
int rlen=h2-i; //右树长度
if(llen)
root->SetLeft(PreInCreat(A,B,l1+1,l1+llen,l2,l2+llen-1));
else
root->SetLeft(NULL);
if(rlen)
root->SetRight(PreInCreat(A,B,h1-rlen+1,h1,h2-rlen+1,h2));
else
root->SetRight(NULL);
return root;
}
/*
先序建树(叶子节点为空)
*/
//先序建树
template<typename E>
BinNode<E>* creatBinaryTree(string s[],int &x,int n) { //传字符数组,工作指针,序列长度
if(s[x]=="/")
return NULL;
else
{
BinNode<E>* node=new BinNode<E>(S[x]);
x++;
if(x<n)
node->setLeft(creatBinaryTree<E>(s,x,n));
x++;
if(x<n)
node->setRight(creatBinaryTree<E>(s,x,n));
return node;
}
}