A1135 Is It A Red-Black Tree (30 分| 红黑树,附详细注释,逻辑分析)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_24452475/article/details/100578765

写在前面

  • 思路分析
    • 给一棵二叉搜索树的前序遍历,判断它是否为红黑树,是输出Yes,否则输出No。
    • 红黑树Red-Black Tree特点
      • 1.根结点是否为黑色
        • 判断根结点(题目所给先序的第1个点即根结点)是否是黑色【arr[0] < 0】
      • 2.将NULL看成1个叶子节点,为黑black
      • 3.如果1个结点是红色,它的孩子节点是否都为黑色
        • 根据建立的树,从根结点开始遍历,如果当前结点是红色,判断它的孩子节点是否为黑色,递
          归返回结果【judge1函数】
      • 4.从任意结点到叶子结点的路径中,黑色结点的个数是否相同
        • 从根节点开始,递归遍历,检查每个结点的左子树的高度和右子树的高度(高度指黑色
          结点的个数),比较左右孩子高度是否相等,递归返回结果【judge2函数】
      • 5.红黑树是二叉搜索树,所以给出前序遍历,中序遍历也可以知道(从小到大排序就是中序遍历),负号不代表大小
  • 知识盲点,学习ing

测试用例

  • input:
    3
    9
    7 -2 1 5 -4 -11 8 14 -15
    9
    11 -2 1 -7 5 -4 8 14 -15
    8
    10 -7 5 -6 8 15 -11 17
    
    output:
    Yes
    No
    No
    

ac代码

  • #include <iostream>
    #include <vector>
    #include <cmath>
    using namespace std;
    
    vector<int> arr;
    struct node
    {
        int val;
        struct node *left, *right;
    };
    
    node* build(node *root, int v)
    {
        if(root == NULL)
        {
            root = new node();
            root->val = v;
            root->left = root->right = NULL;
        }
        else if(abs(v) <= abs(root->val))
            root->left = build(root->left, v);
        else
            root->right = build(root->right, v);
        return root;
    }
    //红节点孩子一定是黑色
    bool judge1(node *root)
    {
        if(root == NULL) return true;
        if(root->val<0)
        {   //判断左孩子
            if(root->left != NULL && root->left->val < 0)
                return false;
            //判断右孩子
            if(root->right != NULL && root->right->val<0)
                return false;
        }
        //递归检查左右孩子
        return judge1(root->left) && judge1(root->right);
    }
    int getNum(node *root)
    {
        if(root == NULL) return 0;
        int l = getNum(root->left);
        int r = getNum(root->right);
    
        return root->val>0 ? max(l, r)+1 : max(l, r);
    }
    // 黑色结点路径高度不等,非红黑树
    bool judge2(node *root)
    {
        if(root == NULL) return true;
        int l = getNum(root->left);
        int r = getNum(root->right);
        if(l != r) return false;
        return judge2(root->left) && judge2(root->right);
    }
    
    int main()
    {
        int k, n;
        scanf("%d", &k);
    
        for(int i=0; i<k; i++)
        {
            scanf("%d", &n);
            arr.resize(n);
    
            // 结点
            node *root = NULL;
            for(int j=0; j<n; j++)
            {
                scanf("%d", &arr[j]);
                root = build(root, arr[j]);
            }
            if(arr[0]<0 || judge1(root)==false || judge2(root)==false)
                printf("No\n");
            else
                printf("Yes\n");
        }
    
        return 0;
    }
    
    

猜你喜欢

转载自blog.csdn.net/qq_24452475/article/details/100578765