【1135】Is It A Red-Black Tree (30分)【红黑树】

简介: 错误insert如下(return问题):
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>  
#include<map>
#include<vector>
#include<queue> 
#include<cmath>
using namespace std;
vector<int> arr;
struct node{
  int data;
  struct node *left,*right;
};
void insert(node* &root,int data){
  if(root == NULL){//空树,查找失败,即要插入的地方
    root=new node;
    root->data=data;
    root->left=root->right=NULL;
    return ;
  }
  if(abs(data)<=abs(root->data)) insert(root->left,data);//插在左子树
  else insert(root->right,data);//插在右子树
} 
//判断红点(-)孩子结点是否为黑点(+)
bool judge1(node *root){
  if(root == NULL)  return true;
  if(root->data<0){//如果为红点
    if(root->left !=NULL && root->left->data<0)
      return false;
    if(root->right !=NULL &&root->right->data<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->data >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);//k个树查询
  for(int i=0;i<k;i++){
    scanf("%d",&n);
    arr.resize(n);
    node *root=NULL;
        //while(1);
    for(int j=0;j<n;j++){
      //while(1);
            scanf("%d", &arr[j]);
            //while(1);
      insert(root,arr[j]);
            //while(1);
        }
        //while(1);
    if(arr[0] <0 || judge1(root)==false || judge2(root)==false)
          printf("No\n");
    else 
      printf("Yes\n");
  }
  system("pause");
    return 0;   
}

错误insert如下(return问题):

node insert(node* &root,int data){
  if(root == NULL){//空树,查找失败,即要插入的地方
    root=new node;
    root->data=data;
    root->left=root->right=NULL;
    return node;
  }
  if(abs(data)<=abs(root->data)) insert(root->left,data);//插在左子树
  else insert(root->right,data);//插在右子树
} 
相关文章
|
11月前
红黑树(Red-Black Tree
红黑树(Red-Black Tree)是一种自平衡二叉搜索树,它的插入、删除和查找操作的平均时间复杂度都是 O(log n)。红黑树的高度始终保持在 O(log n) 级别,因此它是一种高效的数据结构。 红黑树的基本原理是,它的每个节点都有一个平衡因子,表示该节点的左子树和右子树的高度差。插入和删除操作会改变节点的平衡因子,因此需要通过旋转操作来重新平衡树。
47 5
|
11月前
|
存储
数据结构之二叉查找树(Binary Search Tree)和红黑树(Red Black Tree)
二叉查找树又可以称之为 : 二叉搜索树 , 二叉排序树 , 它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势 , 下图中这棵树,就是一棵典型的二叉查找树
140 1
|
存储 缓存 NoSQL
红黑树(Red-Black Tree)
红黑树(Red-Black Tree)
159 0
HDU - 1312 Red and Black(DFS)
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can’t move on red tiles, he can move only on black tiles. Write a program to count the number of black
74 0
|
C++
【PAT甲级 - C++题解】1135 Is It A Red-Black Tree
【PAT甲级 - C++题解】1135 Is It A Red-Black Tree
87 0
|
前端开发 JavaScript 开发者
L1-032 Left-pad (20 分)
L1-032 Left-pad (20 分)
88 0
hdu 1312 Red and Black(BFS)
hdu 1312 Red and Black(BFS)
136 0
|
前端开发 JavaScript 开发者
L1-8 Left-pad (20 分)
根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的模块?就是在字符串前填充一些东西到一定的长度。例如用*去填充字符串GPLT,使之长度为10,调用left-pad的结果就应该是******GPLT。Node社区曾经对left-pad紧急发布了一个替代,被严重吐槽。下面就请你来实现一下这个模块。
105 0