非递归求二叉树的高度
void BiDepth(BiTree &T){ BiTree bit; int last=0,level=0; Queue q; q.rear=-1; q.front=-1; if(!T){ return ; } q.rear++; q.b[q.rear]=T; while(q.front<q.rear){ q.front++; bit=q.b[q.front]; if(bit->lchild){ q.rear++; q.b[q.rear]=bit->lchild; } if(bit->rchild){ q.rear++; q.b[q.rear]=bit->rchild; } if(last==q.front){ level++; last=q.rear; } } printf("二叉树的高度:%d\n",level); }
自下而上,自右而左层次遍历二叉树
void DeLeveLOrder(BiTree &T){ Stack s; Queue q; s.top=-1; q.front=-1; q.rear=-1; BiTree bit; q.rear++; q.b[q.rear]=T; if(!T){ return ; } while(q.front<q.rear){ q.front++; bit=q.b[q.front]; s.top++; s.a[s.top]=bit; if(bit->lchild){ q.rear++; q.b[q.rear]=bit->lchild; } if(bit->rchild){ q.rear++; q.b[q.rear]=bit->rchild; } } while(s.top!=-1){ bit=s.a[s.top]; visit(bit); s.top--; } }
判断是否为一棵完全二叉树
void CompleteTree(BiTree &T){ Queue q; q.front=-1; q.rear=-1; BiTree bit; int flag=1; if(!T){ return ; } q.rear=q.rear+1; q.b[q.rear]=T; while(q.front<q.rear){ q.front++; bit=q.b[q.front]; if(bit){ q.rear++; q.b[q.rear]=bit->lchild; q.rear++; q.b[q.rear]=bit->rchild; } else{ while(q.front<q.rear){ q.front++; bit=q.b[q.front]; if(bit){ flag=0; } } } } if(flag==0){printf("不是完全二叉树\n");} else{printf("是完全二叉树\n");} }
先序遍历打印第k个节点的值
void PreSerch(BiTree &T,int k){ if(T){ i=i+1;//全局变量i控制递归结次数 if(i==k){ printf("%c",T->data); j=1; } if(j==1){return ;}//全局变量j控制递归结束 PreSerch(T->lchild,k); PreSerch(T->rchild,k); } }
查询一个节点的全部祖先节点
思想:采用后序遍历
typedef struct{ BiTree t; int tag;//tag=0左子女被访问,tag=1有子女被访问 }stack1; void SearchPar(BiTree &T,ElemType x){ stack1 s1[MAXSIZE]; int top=-1; BiTree bit=T; while(bit!=NULL||top!=-1){ while(bit!=NULL&&bit->data!=x){ s1[++top].t=bit; s1[top].tag=0; bit=bit->lchild;//向左子树遍历 } if(bit!=NULL&&bit->data==x){ printf("节点的祖先为:"); for(int k=0;k<=top;k++){ printf("%c ",s1[k].t->data); } exit(1);//找到祖先后结束 } while(top!=-1&&s1[top].tag==1){ top--;//退栈 } if(top!=-1){ s1[top].tag=1; bit=s1[top].t->rchild;//向右子树遍历 } } }
求二叉树的带权路径长度
void WorkWPL(BiTree &T){ Queue q; BiTree bit; int depth=0; int lastnode=0;//当前层的最后一个节点的位置 int number=0; q.front=-1; q.rear=-1; if(!T){ return; } q.rear++; q.b[q.rear]=T; depth=depth+1; while(q.front<q.rear){ q.front++; bit=q.b[q.front]; if(bit->lchild==NULL&&bit->rchild==NULL){ number=bit->data*depth+number; } if(bit->lchild){ q.rear++; q.b[q.rear]=bit->lchild; } if(bit->rchild){ q.rear++; q.b[q.rear]=bit->rchild; } if(q.front==lastnode){ lastnode=q.rear; depth=depth+1; } } printf("二叉树的带权路径为:%d\n",number); }
求二叉树的宽度(二叉树节点最多一层的节点数)
void BiWidth(BiTree &T){ Queue q; q.rear=-1; q.front=-1; int lastnode=0;//每一层最后一个节点 int width; int number=0;//记录每一层的节点 BiTree bit; if(!T){ return ; } q.b[++q.rear]=T; width=1; while(q.front<q.rear){ bit=q.b[++q.front]; number=number+1; if(bit->lchild){ q.b[++q.rear]=bit->lchild; } if(bit->rchild){ q.b[++q.rear]=bit->rchild; } if(q.front==lastnode){ lastnode=q.rear; if(number>width){ width=number; } number=0; } } printf("二叉树的宽度:%d\n",width); }