今天见到了之前没有写过的功能,记录一下
//统计树中度为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;
}
}
这篇博客详细介绍了二叉树的各种操作,包括统计度为1和2的节点数量、交换节点的左右孩子、查找指定元素的层数、先序输出节点与层数以及打印每一层最右端的节点。此外,还提供了先序序列和中序序列构建二叉树以及仅使用先序序列创建二叉树的方法。这些算法对于理解和操作二叉树数据结构至关重要。

被折叠的 条评论
为什么被折叠?



