问答题
要求二叉树按二叉链表形式存储。(1)写一个建立二叉树的算法。(2)写一个判别给定的二叉树是否是完全二叉树的算法。完全二叉树定义为:深度为K,具有N个结点的二叉树的每个结点都与深度为K的满二叉树中编号从1至Ⅳ的结点一一对应。此题以此定义为准。【西北大学2000六(12分)】【哈尔滨工业大学2000十一(14分)】【南开大学1997四 (16分)】【北京邮电大学1994九(20分)】
【正确答案】正确答案:二叉树是递归定义的,以递归方式建立最简单。核心语句段如下: cin>>x; //本题假定结点数据域为整型 if(x==0)bt=null; //空指针 else if(x>0) {bt=new(BiNode); //申请空间 bt->data=x; bt->ichild=creat();bt->rchiId=creat(); } else error(“输入错误”); return(bt); 判定是否是完全二叉树,可以使用队列,在遍历中利用完全二又树“若某结点无左子女就不应有右子女”的原则进行判断。判断时易犯的错误是由左子树和右子树都是完全二 叉树,推出整棵二叉树必是完全二叉树的错误结论。核心语句段如下: if(p==null)return(1); //p是二叉树 QueueInit(Q);QueueIn(Q,p); //初始化队列,根结点指针入队 while(!QueueEmpty(Q)) (p=Queueout(Q); //出队 if(p->ichild&&!tag)QueueIn(Q,p->ichild); //左子女入队 else if(p一>ichild)return 0; //前边已有结点为空,本结点不空 else tag=l; //首次出现结点为空 if(p一>rchild&&!tag)QueueIn(Q,P一>rchild); //右子女入队 else if(p->rchiid)return 0;else tag=1 ; }//while
【答案解析】