[二叉树算法]关于层次遍历二叉树的一些算法总结
//递归遍历二叉树 void levelOrder(BTNode *T){ if(T==null) return; int height=getHeight(T); for(int i=1;i<height;i++){ _levelOrder(T,i); } } void _levelOrder(BTNode *T,int num){ if(T==null||i==0) return; if(i==1){ visit(T->data); return; } _levelOrder(T->lchild,i-1); _levelOrder(T->rchild,i-1); }
//使用栈 void levelOrder(BiTree T){ Init(Queue Q); BTNode* p; EnQueue(Q,T); while(!isEmpty(Q)){ DeQueue(Q,p); visit(p); if(T->lchild){ EnQueue(Q,T->lchild); } if(T->rchild){ EnQueue(Q,T->rchild); } } }
关于层次遍历二叉树的相关应用
//层次遍历求二叉树高度 int Height(BTNode *T){ if(T==null) return 0; else{ InitQueue(Q); int front=-1,rear=-1; int last=0,level=0; Q[++rear]=T; BTNode *p; while(front<rear){ p=Q[++front]; if(p->lchild!=null) Q[++rear]=p->lchild; if(p->rchild!=null) Q[++rear]=p->rchild; if(front==last){ level++; last=rear; } } return level; } }
//求指定层次叶子节点的个数 int Count_leaf(BTNode *t,int k){ if(t==null) return 0; BTNode *p; int front=-1,rear=-1; int last=0,level=0,num=0; InitQueue(Q); Q[++rear]=T; while(front<rear){ p=Q[++front]; if(p->lchild==null && p->rchild==null && level=k-1) num++; if(p->lchild!=null) Q[++rear]=p->lchild; if(p->rchild!=null) Q[++rear]=p->rchild; if(front==last){ last=rear; level++; } if(level>k) return num; } return 0; }
//求二叉树的宽度 int count_bread(BTNode *t){ if(t==null) return 0; BTNode *p; int front=-1,rear=-1; int last=0; InitQueue(Q); int tempnum=0,max=0; Q[++rear]=T; while(front<rear){ p=Q[++front]; tempnum++; if(p->lchild!=null) Q[++rear]=p->lchild; if(p->rchild!=null) Q[++rear]=p->rchild; if(front==last){ last=rear; if(tempnum>max){ max=tempnum; } tempnum=0; } } return max; }
//判断一棵树是否为完全二叉树 4 bool IsComplete(BTNode *T){ if(T==null) return true; BTNode *p=T; InitQueue(Q,p); while(!isEmpty(Q)){ p=DeQueue(Q); if(p==null) break; EnQueue(Q,p->lchild); EnQueue(Q,p->rchild); } while(!isEmpty(Q)){ p=DeQueue(&Q); if(p!=null) return false; } return true; }
欢迎留言讨论