树与二叉树的基本操作
- 1、统计二叉树中度为0的结点个数
- 2、统计二叉树中度为1的结点个数
- 3、统计二叉树中度为2的结点个数
- 4、统计二叉树的高度
- 5、统计二叉树的宽度
- 6、从二叉树中删除所有叶结点
- 7、计算指定结点*p所在的层次
- 8、计算二叉树各结点中最大元素的值。
- 9、交换二叉树中每个结点的两个子女
- 10、以先序次序输出一颗二叉树中所有结点的数据值及结点所在的层次。
typedef int ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
1、统计二叉树中度为0的结点个数
int NodeDegree_0(BiTree bt){
if(bt != NULL){
if(bt->lchild == NULL && bt->rchild == NULL)
return 1;
else return NodeDegree_0(bt->lchild) + NodeDegree_0(bt->rchild);
}
else return 0;
}
2、统计二叉树中度为1的结点个数
int NodeDegree_1(BiTree bt){
if(bt != NULL){
if((bt->lchild != NULL && bt->rchild == NULL) || (bt->rchild != NULL && bt->lchild == NULL))
return NodeDegree_1(bt->lchild) + NodeDegree_1(bt->rchild) + 1;
else return NodeDegree_1(bt->lchild) + NodeDegree_1(bt->rchild);
}
else return 0;
}
3、统计二叉树中度为2的结点个数
int NodeDegree_2(BiTree bt){
if(bt != NULL){
if(bt->lchild != NULL && bt->rchild != NULL)
return NodeDegree_2(bt->lchild) + NodeDegree_2(bt->rchild) + 1;
else return NodeDegree_2(bt->lchild) + NodeDegree_2(bt->rchild);
}
else return 0;
}
4、统计二叉树的高度
int getHeight(BiTree bt){
if(bt == NULL) return 0;
int hl = getHeight(bt->lchild);
int hr = getHeight(bt->rchild);
return (hl > hr ? hl : hr) + 1;
}
5、统计二叉树的宽度
int getWidth(BiTree bt){
queue<BiTree> q;
int width = 0;
int maxWidth = 0;
q.push(bt);
BiTNode *p = NULL;
while(!q.empty()){
width = q.size();
for(int i = 0; i < width; i++){
p = q.front();
q.pop();
if(p->lchild != NULL){
q.push(p->lchild);
}
if(p->rchild != NULL){
q.push(p->rchild);
}
}
if(width > maxWidth)
maxWidth = width;
}
return maxWidth;
}
6、从二叉树中删除所有叶结点
void DelLeafNode(BiTree bt){
BiTNode *p = bt;
if((p->lchild == NULL && p->rchild == NULL) || p == NULL){
free(p);
return;
}
else if(p->lchild->lchild == NULL && p->lchild->rchild == NULL){
free(p->lchild);
p->lchild = NULL;
}
else if(p->rchild->lchild == NULL && p->rchild->rchild == NULL){
free(p->rchild);
p->rchild = NULL;
}
DelLeafNode(bt->lchild);
DelLeafNode(bt->rchild);
}
7、计算指定结点*p所在的层次
int GetLevel(BiTree bt,BiTNode *p){
if(bt == NULL) return 0;
if(bt == p) return 1;
int depl = GetLevel(bt->lchild, p);
int depr = GetLevel(bt->rchild, p);
if(depl || depr){
if(depl > depr) return depl + 1;
else return depr + 1;
}
return 0;
}
8、计算二叉树各结点中最大元素的值。
int GetMaxNode(BiTree bt){
if(bt == NULL) return 0;
int maxl = GetMaxNode(bt->lchild);
int maxr = GetMaxNode(bt->rchild);
int maxlr = maxl > maxr ? maxl : maxr;
int maxNode = maxlr > bt->data ? maxlr : bt->data;
return maxNode;
}
9、交换二叉树中每个结点的两个子女
void SwapNodeChild (BiTree bt){
if(bt->lchild != NULL)
SwapNodeChild(bt->lchild);
if(bt->rchild != NULL)
SwapNodeChild(bt->rchild);
BiTNode *p = bt->lchild;
bt->lchild = bt->rchild;
bt->rchild = p;
}
10、以先序次序输出一颗二叉树中所有结点的数据值及结点所在的层次。
void PrintByPreOrder(BiTree bt,int level){
if(bt != NULL){
cout << level << ":" << bt->data << endl;
PrintByPreOrder(bt->lchild,level);
PrintByPreOrder(bt->rchild,level);
}
}