关于树的判定(满二叉树完全二叉树平衡二叉树相似二叉树等价二叉树)
Posted 薛定谔的猫ovo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于树的判定(满二叉树完全二叉树平衡二叉树相似二叉树等价二叉树)相关的知识,希望对你有一定的参考价值。
满二叉树
题目描述:
设二叉树采用二叉链表存储,设计一个算法,判断二叉树是否是满二叉树。
算法思想:
满二叉树即深度为h,结点个数为2h-1的二叉树。
所以,首先会想到的算法思路即求出二叉树的高度h,看其总结点的个数是否等于2h-1。
实现代码:
<1>首先给出求解二叉树高度的算法,此处给出的是递归求解算法,非递归算法可参照递归算法及非递归算法求二叉树的高度
//求二叉树的高度
int getDepth(BNode *root){
if(root == NULL){
return 0;
}
int left = getDepth(root->lchild);
int right = getDepth(root->rchild);
return left>right ? left+1 : right+1;
}
<2>对于计算二叉树中结点的个数,也采用递归算法,其算法思路为:若二叉树为空,则返回结点数0,否则函数返回根的左子树和右子树中所包含的结点个数的和再加1。
//求二叉树的结点个数
int countNode(BNode *root){
if(root == NULL)
return 0;
else
return countNode(root->lchild)+countNode(root->rchild)+1;
}
<3>那么判断一棵二叉树是否是满二叉树的函数为
//判断是否是满二叉树
bool IsFull(BNode *root){
int h = getDepth(root);
int sum = countNode(root);
if(sum == (pow(2,h)-1))
return true;
else
return false;
}
完全二叉树
题目描述:
设二叉树采用二叉链表存储,设计一个算法,判断二叉树是否是完全二叉树。
算法思想:
采用层序遍历算法,将所有的结点加入队列,包括空结点。遇到空结点时,查看其后是否有非空结点,若有,则二叉树不是完全二叉树。
实现代码:
bool IsComplete(BNode *root){
queue<BNode *> node;
if(root == NULL) //空树为满二叉树
return true;
node.push(root); //根结点入栈
while(!node.empty()){
BNode *p = node.front();
node.pop();
if(p != NULL){ //结点非空,将其左右子树入队
node.push(p->lchild);
node.push(p->rchild);
}else{ //结点为空,则检查其后是否有非空结点
while(!node.empty()){
BNode *p = node.front();
node.pop();
if(p != NULL) //结点非空,则二叉树为非完全二叉树
return false;
}
}
}
return true;
}
平衡二叉树
题目描述:
设二叉树采用二叉链表存储,设计一个算法,判断一个二叉树是否是平衡二叉树。所谓平衡二叉树,是指左子树和右子树的高度差不大于1。
算法思想:
采用二叉树高度的递归算法实现。若一个结点的左、右子树的高度差为1、-1、0,则算法返回true,否则返回false。
根据二叉树的后序遍历的思想,在遍历一个结点之前已经遍历了其左右子树,在遍历每个结点时记录它的深度,就可以一边遍历一边判断每个结点是否是平衡的。
易知,在遍历某个结点的左右结点之后,我们可以根据它的左右子结点的深度来判断它是不是平衡的,并且得到当前该结点的深度。当遍历到根结点时,就能够判断该二叉树是否是平衡二叉树了。
实现代码:
bool IsBalance(BNode *root, int &height){
if(root == NULL){ //空树高度为0,平衡
height = 0;
return true;
}
int left,right;
if(IsBalance(root->lchild, left) == false)
return false;
if(IsBalance(root->rchild, right) == false)
return false;
height = (left>right) ? left+1 : right+1;
if(abs(left-right) <= 1)
return true;
else
return false;
}
相似二叉树
题目描述:
设二叉树采用二叉链表存储,设计一个算法,判断两棵二叉树是否相似。
所谓二叉树T1和T2相似,指的是T1和T2都是空的二叉树或都只有一个根结点;或二叉树T1的左子树和T2的左子树是相似的,且T1的右子树和T2的右子树是相似的。
算法思想:
采用递归的思想求解,若T1和T2都是空树,则相似;若有一个为空另一个不空,则必然不相似;否则递归的比较它们的左、右子树是否相似。
实现代码:
bool IsSimilar(BNode *root1, BNode *root2){
int left,right;
if(root1==NULL && root2==NULL){
return true;
}else if(root1==NULL || root2==NULL){
return false;
}else{
left = IsSimilar(root1->lchild, root2->lchild);
right = IsSimilar(root1->rchild, root2->rchild);
return left&&right;
}
}
等价二叉树
题目描述:
设二叉树采用二叉链表存储,设计一个算法,判断两棵二叉树是否等价。
所谓两棵二叉树等价,是指二叉树T1和T2不仅在树形上相似,且对应结点的元素值都相等,则称这两棵二叉树等价。
算法思想:
采用递归的方法求解。若二叉树T1和二叉树T2都为空,则它们等价。如果两棵二叉树T1和T2中有一棵为空另一棵不为空,则它们不等价。当它们都不为空时判断根结点的元素值是否对应相等,若不是,则两棵二叉树不等价;若是,则继续判断它们的左子树和右子树是否等价,若它们都等价,则最后两个二叉树等价。
实现代码:
bool IsEqual(BNode *root1, BNode *root2){
if(root1==NULL && root2==NULL)
return true;
else if(root1==NULL || root2==NULL)
return false;
else if(root1->data != root2->data)
return false;
else if(IsEqual(root1->lchild, root2->lchild) && IsEqual(root1->rchild, root2->rchild))
return true;
else
return false;
}
以上是关于关于树的判定(满二叉树完全二叉树平衡二叉树相似二叉树等价二叉树)的主要内容,如果未能解决你的问题,请参考以下文章