zoukankan      html  css  js  c++  java
  • PAT1135 Red And Black Tree

    原题链接:PAT1135

    解析:以前只是听说过红黑树,但是这次是第一次接触红黑树,如果考试时出现这种没看过的数据结构,挺麻烦的。判断一个二叉树是否为红黑树有三个条件:

    1. 根节点是否为黑色
    2. 红色节点的子节点是否为黑色
    3. 每条路径上的黑色节点数量是否相同

    错误报告:主要是建树方面出了问题,我写的其他地方思路以及形式都和题解一样,只是我想用数组存树,带来了很多麻烦,最终也导致几个点一直过不去,改用指针之后就过了。

    代码实例:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    struct Node{
    	int val;
    	Node *ls,*rs;
    };
    Node *BuildTree(Node *root,int val){
    	if(root == NULL){
    		root = new Node();
    		root->val = val;
    		root->ls = NULL;
    		root->rs = NULL;
    		return root;
    	}
    	if(abs(val) <= abs(root->val))
    		root->ls = BuildTree(root->ls,val);
    	else
    		root->rs = BuildTree(root->rs,val);
    	return root;
    }
    int getcolor(Node* root){
    	return root->val;
    }
    bool judge1(Node *root){
    	if(root == NULL)	return true;
    	if(root->val < 0){
    		if(root->ls != NULL && getcolor(root->ls) < 0)	return false;
    		if(root->rs != NULL && getcolor(root->rs) < 0)	return false;
    	}
    	return judge1(root->ls) && judge1(root->rs);
    }
    int getnum(Node *root){
    	if(root == NULL)	return 0;
    	int l = getnum(root->ls);
    	int r = getnum(root->rs);
    	return root->val > 0 ? max(l,r)+1:max(l,r);
    }
    bool judge2(Node *root){
    	if(root == NULL) 	return true;
    	if(getnum(root->ls) == getnum(root->rs))
    		return judge2(root->ls) && judge2(root->rs);
    	else return false;
    }
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	while(t--){
    		int n,val;
    		Node *root = NULL;
    		scanf("%d",&n);
    		for(int i = 0;i < n;i++){
    			scanf("%d",&val);
    			root = BuildTree(root,val);
    		}
    		bool flag = true;
    		if(root->val < 0)	flag = false;
    		if(flag && !judge1(root))	flag = false;
    		if(flag && !judge2(root))	flag = false;
    		if(flag)	puts("Yes");
    		else puts("No");
    	}
    	return 0;
    } 
  • 相关阅读:
    怎样创建动态扩容数组?
    怎样终止一个线程?
    模式识别
    基于Linux根据僵尸网络病毒平台《比尔盖茨》
    web.xml在&lt;init-param&gt;一个错误
    DTD学习笔记
    Java排序算法(四):Shell排序
    VC6迁移到VS2008几个问题——良好的代码,从我做起,从现在开始。
    Maven 建 Struts2 基本实现 CURD Controller
    Andy&#39;s First Dictionary
  • 原文地址:https://www.cnblogs.com/long98/p/10352183.html
Copyright © 2011-2022 走看看