【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);//插在右子树
} 
相关文章
红黑树(Red-Black Tree
红黑树(Red-Black Tree)是一种自平衡二叉搜索树,它的插入、删除和查找操作的平均时间复杂度都是 O(log n)。红黑树的高度始终保持在 O(log n) 级别,因此它是一种高效的数据结构。 红黑树的基本原理是,它的每个节点都有一个平衡因子,表示该节点的左子树和右子树的高度差。插入和删除操作会改变节点的平衡因子,因此需要通过旋转操作来重新平衡树。
65 5
|
存储
数据结构之二叉查找树(Binary Search Tree)和红黑树(Red Black Tree)
二叉查找树又可以称之为 : 二叉搜索树 , 二叉排序树 , 它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势 , 下图中这棵树,就是一棵典型的二叉查找树
153 1
|
存储 编解码 算法
高度优先左高树(Height-Based Left-Triangle,
高度优先左高树(Height-Based Left-Triangle,简称HBLT)是一种用于压缩图像和图形数据的算法。它通过将图像或图形分割成三角形,并对这些三角形进行编码和存储,从而实现压缩。这种方法可以在保持视觉质量的同时,有效地减小文件大小。
117 4
141Echarts - 树图(From Top to Bottom Tree)
141Echarts - 树图(From Top to Bottom Tree)
60 0
138Echarts - 树图(From Bottom to Top Tree)
138Echarts - 树图(From Bottom to Top Tree)
43 0
|
存储 缓存 NoSQL
红黑树(Red-Black Tree)
红黑树(Red-Black Tree)
197 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
89 0
|
C++
【PAT甲级 - C++题解】1135 Is It A Red-Black Tree
【PAT甲级 - C++题解】1135 Is It A Red-Black Tree
103 0
hdu 1312 Red and Black(BFS)
hdu 1312 Red and Black(BFS)
147 0