二叉树判定问题
1.判定是否为二叉排序树
//1.判定是否为二叉排序树
//思想:对于一个二叉排序树进行先序遍历得到的是一个递增的序列,故每个结点都会大于其前驱结点的内容
int prev=0;
int flag=1;//表示是二叉排序树
void Inorder(BiTnode *T){
if(T!=NULL){
Inorder(T->lchild);
if(T->data<prev){
flag=0;
}
prev=T->data;
Inorder(T->rchild);
}
}
2.判定是否为完全二叉树
//2.判定是否为完全二叉树
//思想:对于完全二叉树层序遍历,如果某一个结点为空,判断其后面的结点是否存在空结点,如果存在非空结点则说明不是完全二叉树
bool isComplete(BiTnode *T){
queue<BiTnode> que;
if(T==NULL)return true;
que.push(T);
while(!que.empty()){
bnode p=que.front();que.pop();
if(p!=NULL){
que.push(p->lchild);
que.push(p->rchild);
}
else{
while(!que.empty()){
bnode p=que,front();que.pop();
if(p==NULL)return false;
}
}
}
}
3.判断二叉树是否为平衡二叉树
//3.判断二叉树是否为平衡二叉树
//思想:如果一个结点的左右子树的平衡因子之差的绝对值大于1,则说明该二叉树不平衡
int flag=1;
int check(BiNode *T){
int l,r;
if(T==NULL)return 0;
if(T!=NULL){
l=check(T->lchild);
r=check(T->rchild);
if(abs(l-r)>1)
flag=0;
if(l>=r)
return l+1;
else
return r+1;
}
}
二叉树统计问题
1.统计二叉树的结点个数
//1.统计二叉树的结点个数
int count(Binode *T){
int a,b;
if(T==NULL)return 0;
else{
a=count(T->lchild);
b=count(T->rchild);
return a+b+1;
}
}
2.统计叶子结点的个数
//2.统计叶子结点的个数
int count(Binode *T){
int a,b;
if(T==NULL)return 0;
else if(T->lchild==NULL&&T->rchild==NULL) return 1;
else{
a=count(T->lchild);
b=count(T->rchild);
return a+b;
}
}
3.求二叉树单分支结点的个数
//3.求二叉树单分支结点的个数
int count(Binode *T){
int a,b;
if(T==NULL)return 0;
else if((T->lchild!=NULL&&T->rchild==NULL)||(T->lchild==NULL&&T->rchild!=NULL)){
a=count(T->lchild);
b=count(T->rchild);
return a+b+1;
}
else{
a=count(T->lchild);
b=count(T->rchild);
return a+b;
}
}
4.求二叉树双分支结点个数
//4.求二叉树双分支结点个数
int count(Binode *T){
int a,b;
if(T==NULL) return 0;
else if(T->lchild!=NULL && T->rchild!=NULL){
a=count(T->lchild);
b=count(T->rchild);
return a+b+1;
}
else{
a=count(T->lchild);
b=count(T->rchild);
return a+b;
}
}
5.计算各结点的子孙结点个数
//5.计算各结点的子孙结点个数
int count_child(Binode *T){
int a,b;
if(T==NULL) return 0;
else{
a=count_child(T->lchild);
b=count_child(T->rchild);
return a+b+1;
}
}
void count(Binode *T){
if(T!=NULL){
cout<<"结点:"<<T->data<<" 的子孙结点个数是:"<<count_child(T)<<endl;
count(T->lchild);
count(T->rchild);
}
}
6.求二叉树的高度
//6.求二叉树的高度
int high(Binode *T){
if(T==NULL) return 0;
else{
return max(high(T->lchild),high(T->right))+1;
}
}
7.二叉树宽度
//7.二叉树宽度
int get_width(Binode *root){
if(root==NULL) return 0;
int maxWidth=0;
binode *que[100],*p;
int rear=0,front=0,size;
que[++rear]=root;
while(rear!=front){
size=rear-front;
while(size>0){
binode *temp=que[++front];
size--;
if(temp->lchild)
que[++rear]=temp->lchild;
if(temp->rchild)
que[++rear]=temp->rchild;
}
maxWidth=maxWidth>(rear-front)?maxWidth:(rear-front)
}
return maxWidth;
}