已知一棵二叉树采用二叉链表存储,结点构造为root指向根结点。请编写算法判断该二叉树是否是平衡二叉树,即二叉树中任意结点的左右子树的深度相差不超过1,例如下图所示的二叉树就是一棵平衡二叉树。
问答题 给出算法的基本设计思想。
【正确答案】正确答案:基本的基本设计思想: 设置二叉树的平衡标记balance,以标记返回二叉树bt是否为平衡二叉树,若为平衡二叉树,则返回1,否则返回0;h为二叉树bt的高度。采用前序遍历的递归算法: ①若bt为空,则高度为0,balance=1。 ②若bt仅有根结点,则高度为1,balance=1。 ③否则,对bt的左、右子树执行递归运算,返回左、右子树的高度和平衡标记,bt的高度为 最高子树的高度加1。若左、右子树的高度差大于1,则balance=0;若左、右子树的高度差小于 1,且左、右子树都平衡时,balance=1,否则balance=0。
【答案解析】
问答题 根据设计思想,采用C或C++语言描述算法,关键之处给出注释。
【正确答案】正确答案:算法的实现加下: void Judge_AVL(BjiTree bt,int &balance,int&h){ int bl,br,hl,hr; //左、右子树的平衡标记和高度 if,(bt==NULL){ //空树,高度为0 h=0, balance=1; } else if(p—>ichild==NULL&&p—>rchild==NULL){//仅有根结点,则高度为1 h=1; balance=1; } else{ Judge_AVL(bt—>lchild,bl,hi); //递归判断左子树 Judge_AVL(bt—>rchild,br,hr), //递归判断右子树 h=(hl>hr?hl:hr)+1, if(abs(hl,hr)<2) //若高度绝对值小于2,则看左、右子树是否都平衡 balance=bl&br; //&为逻辑与,即左、右子树都平衡时,二叉树平衡 else balance=0; } }
【答案解析】