• 1135 Is It A Red-Black Tree (30 分)


    1135 Is It A Red-Black Tree (30 分)
     

    There is a kind of balanced binary search tree named red-black tree in the data structure. It has the following 5 properties:

    • (1) Every node is either red or black.
    • (2) The root is black.
    • (3) Every leaf (NULL) is black.
    • (4) If a node is red, then both its children are black.
    • (5) For each node, all simple paths from the node to descendant leaves contain the same number of black nodes.

    For example, the tree in Figure 1 is a red-black tree, while the ones in Figure 2 and 3 are not.

    rbf1.jpgrbf2.jpgrbf3.jpg
    Figure 1 Figure 2 Figure 3

    For each given binary search tree, you are supposed to tell if it is a legal red-black tree.

    Input Specification:

    Each input file contains several test cases. The first line gives a positive integer K (≤30) which is the total number of cases. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the preorder traversal sequence of the tree. While all the keys in a tree are positive integers, we use negative signs to represent red nodes. All the numbers in a line are separated by a space. The sample input cases correspond to the trees shown in Figure 1, 2 and 3.

    Output Specification:

    For each test case, print in a line "Yes" if the given tree is a red-black tree, or "No" if not.

    Sample 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
    

    Sample Output:

    Yes
    No
    No

    红黑树也不过是如此嘛,反正都是跟着规则来。
    我的output函数基本上解决了所有的判断。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int n, m, x;
     4 struct Node
     5 {
     6     int val;
     7     Node *left, *right;
     8 };
     9 set<int> st;
    10 Node *insert(Node *root, int val){
    11     if(root == NULL){
    12         root = new Node();
    13         root->val = val;
    14         root->left = root->right = NULL;
    15     }else{
    16         if(abs(root->val) > abs(val)){
    17             root->left = insert(root->left, val);
    18         }else{
    19             root->right = insert(root->right, val);
    20         }
    21     }
    22     return root;
    23 }
    24 bool output(Node *root, int x){
    25     if(root != NULL){
    26         int y = root->val<0?0:1;
    27         if(root->left != NULL && root->val<0&&root->left->val<0)
    28             return false;
    29         if(root->right != NULL && root->val<0&&root->right->val<0)
    30             return false;
    31         if(!output(root->left, x+y)) return false;
    32         if(!output(root->right, x+y)) return false;
    33     }else{
    34         st.insert(x);
    35     }
    36     return true;
    37 }
    38 int main(){
    39     cin >> n;
    40     while(n--){
    41         Node *tree = NULL;
    42         st.clear();
    43         cin >> m;
    44         for(int i = 0; i < m; i++){
    45             cin >> x;
    46             tree = insert(tree, x);
    47         }
    48         if(tree->val < 0){
    49             cout << "No" << endl;
    50         }else{
    51             bool flag = output(tree, 0);
    52             if(flag && st.size() == 1){
    53                 cout <<"Yes"<<endl;
    54             }else{
    55                 cout << "No"<<endl;
    56             }
    57         }
    58     }
    59     return 0;
    60 }





  • 相关阅读:
    7
    6
    5
    3
    4
    2
    1
    寒假工作经历
    软件工程第三周的总结
    软件工程第三周的学习报告 html<input> final finally finalize 的比较 BigInteger
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/11330134.html
Copyright © 2020-2023  润新知