完全二叉树判断
根据二叉树的定义,具有n个结点的完全二叉树与满二叉树中编号为1~n的结点一一对应。
算法思想:
采用层次遍历的算法,将所有结点加入队列,(包括空结点)
当遇到空结点时,检查后面是否有非空结点。若有,则不是完全二叉树.
bool IsComplete(node *root){
if(!root) return true;
queue<node *> q;
node *now;
q.push(root);
while(!q.empty()){
now =q.front();
q.pop();
if(now){
q.push(now->lchild);
q.push(now->rchild);
}
else{
while(!q.empty()){
now=q.front();
q.pop();
if(now) return false;
}
}
}
return true;
}
交换左右子树:
采用递归算法实现交换左、右子树,
1)首先交换b结点左孩子的左、右子树,
2)然后交换b结点右孩子的左、右子树,
3)最后交换b结点的左右子树,当节点为空时递归结束(后序遍历思想)。
算法实现如下:
void swap(BiTree b){
if(b){
swap(b->lchild);
swap(b->rchild);
temp=b->lchild;
b->lchild=b->rchild;
b->rchild=temp;
}
}