要求二叉树按二叉链表形式存储,并且:
(1)写一个建立二叉树的算法。
(2)写一个判别给定的二叉树是否是完全二叉树的算法。完全二叉树定义为:深度为K,具有N个结点的二叉树的每个结点都与深度为K的满二叉树中编号从1至N的结点一一对应。
参考答案:二叉树是递归定义的,以递归方式建立最简单。判定是否是完全二叉树,可以使用队列,在遍历中利用完全二叉树“若某结点无左子女就不应有右子女”的原则进行判断。判断时易犯的错误是证明其左子树和右子树都是完全二叉树,由此推出整棵二叉树必是完全二叉树的错误结论。
BiTree creat() ∥建立二叉树的二叉链表形式的存储结构
{ElemTvpe x;BiTree bt;
scan{(“%d”,&x); ∥本题假定结点数据域为整型
if(x==0)bt===null;
else if(X>0)
{bt-(BiNode*)malloc(sizeo{(BiNode));
bt->data-x;bt->lchild-creat();bt->rchild=creat();
}
else error(“输入错误”);
return(bt);
}∥结束BiTree
int JudgeComplete(BiTree bt)
∥N断二叉树是否是完全二叉树,如是,返回1,否则,返回0
{int tag=0;BiTree p=bt,Q[]; ∥Q是队列,元素是二叉树结点指针,容量足够大
if(p==null)return(1);
QueueInit(Q);QueueIn(Q,p); ∥初始化队列,根结点指针入队
while(!QueueEmpty(Q))
{p=QueueOut(Q); ∥出队
if(p->ichild&&!tag)QueueIn(Q,p->lchild); ∥左孩子入队
else(if(p->lchild)return 0; ∥前边已有结点为空,本结点不空
else tag=1; ∥首次出现结点为空
if(p->rchild&&!tag)QueueIn(Q,p->rchild); ∥右孩子入队
else if(p->rchild)return 0;else tag=1;
}∥while
return 1;}