判断二叉树是否平衡、是否完全二叉树、是否二叉排序树

1.判断二叉树是否平衡

复制代码
//求树的高度
int TreeDepth(Node* t)
{
    int hl,hr,h;
    if(t != NULL)
    {
        hl = TreeDepth(t->left);
        hr = TreeDepth(t->right);
        h = hl>hr? hl:hr;
        return h+1;
    }
    return 0;
}

//判断二叉树是否平衡
int isBalanced(Node* t)  
{ 
    if(t==NULL) return 1; 
    int leftDepth = TreeDepth(t->left); 
    int rightDepth = TreeDepth(t->right); 
    if(abs(leftDepth-rightDepth) > 1) 
        return 0; 
    else 
        return isBalanced(t->left) && isBalanced(t->right); 
}
复制代码

2.判断二叉树是否相同

复制代码
//判断两棵二叉树是否相同
int CompTree(Node* tree1, Node* tree2)
{
    if(tree1 == NULL && tree2 == NULL)
        return 1;
    else if(tree1 == NULL || tree2 == NULL)
        return 0;
    if(tree1->data != tree2->data)
        return 0;
    if(CompTree(tree1->left,tree2->left)==1 && CompTree(tree1->right,tree2->right)==1)
        return 1;
    //反转二叉树也可能相同
    if(CompTree(tree1->left,tree2->right)==1 && CompTree(tree1->right,tree2->left)==1)
        return 1;
    return 0;
}
复制代码
复制代码
//拷贝二叉树   
void CopyTree(Node* s,Node* & d)  
{  
    if(s==NULL) d = NULL;  
    Node* temp = new Node;  
    temp->data = s->data;  
    if(d==NULL) d = temp;  
    if(s->left) CopyTree(s->left,d->left);  
    if(s->right) CopyTree(s->right,d->right);  
} 
复制代码

3.判断二叉树是否完全二叉树

判断二叉树是否是完全二叉树:层次遍历二叉树,遍历的左右节点入队列。若出队列的结点为空,则以后出队列的结点都为空,则为完全二叉树,否则不是

复制代码
int ComplateTree(Node* bt)
{
    Node* p=bt;
    queue<Node*> q;
    int tag=0;
    if(p==NULL) return 1;
    q.push(p);
    while(!q.empty())
    {
         p=q.front(); q.pop(); 
         if(p->left && !tag) q.push(p->left);
         else if(p->left)  return 0;
         else tag=1;
         if(p->right && !tag) q.push(p->right);
         else if(p->right)  return 0;
         else tag=1;
    }
    return 1;
}
复制代码

4.判断二叉树是否二叉排序树

判断二叉树是否是二叉排序树(BST):根据中序遍历序列是否升序来判断

复制代码
bool IsBinarySortTree(Node* bt)
{
    stack<Node*> s;
    Node* p = bt;
    Node* pre = NULL;   // pre保持为p的中序前驱
    while(p || !s.empty())
    {
        if(p)
        {
            s.push(p);
            p = p->left;
        }
        else
        {
            p = s.top(); s.pop();
            if( pre && (p->data <= pre->data) )  return false;  // 不是二叉排序树
            pre = p;   // 记下前驱结点
            p = p->right;
        }
    }
    return true;  // 二叉排序树
}
复制代码

判断二叉树是否是二叉排序树(BST):层次遍历二叉树,若出队列的结点小于左结点的值,或者是大于右结点的值,则不是BST,否则是BST

复制代码
bool IsBST(Node* T)
{
    queue<Node*> q;
    Node* p;
    if(T == NULL) return true;
    q.push(T);
    while(!q.empty())
    {
        p = q.front(); q.pop();
        if(p->left)
          if(p->data < p->left->data)
             return false;
          else q.push(p->left);
        if(p->right)
          if(p->data > p->right->data)
             return false;
          else q.push(p->right);
    }
    return true;
}
复制代码

 

作者:阿凡卢

出处:https://www.cnblogs.com/luxiaoxun/archive/2012/08/04/2622786.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   阿凡卢  阅读(6778)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示