关于树的判定(满二叉树完全二叉树平衡二叉树相似二叉树等价二叉树)

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;
}

以上是关于关于树的判定(满二叉树完全二叉树平衡二叉树相似二叉树等价二叉树)的主要内容,如果未能解决你的问题,请参考以下文章

二叉树平衡二叉树完全二叉树满二叉树 .

如何判定一颗树是完全二叉树和满二叉树

急急~判断一棵二叉树是满二叉树的算法!

二叉树的基本概念

完全二叉树与满二叉树的区别是啥?

树二叉树完全/满/平衡二叉树的理解与对比