PAT 1135. Is It A Red-Black Tree (30) 二叉搜索树建立 + 红黑树判断
来源:互联网 发布:win7不允许安装软件 编辑:程序博客网 时间:2024/06/05 18:14
今天PAT考完试,只做出了3道题,70分。
问题在于读题。
前两题还挺顺利,很快凭借直接做完了,花了50分钟。
第三题卡在题意误解上。 判断的是“各边是否都与 所给集合点 相连” ,而非“各点与各点”相连。 当发现真正题意后,很快就做对了。
第四题最惨,1个小时的时间,有半小时在理解题意上,很短的题目,竟然没注意到“搜索树构建”,只看到“前序序列”。。。
还有,最后其实已经写成功了,就差了一句代码,就是重置根节点——因为这一次有多个输入样例!故搜索树必须重置
只能说命运可能就差了那么一两句代码?
#include<iostream>#include<cstdio>#include<algorithm>#include<queue>#include<string.h>#include<cmath>#include<string>using namespace std;//跪在题意理解(搜索树构建)和代码错误/*************************题意:构建二叉搜索树,插入的节点有红黑之分判断该树是否为红黑树。*************************//************************求解要点:1.构建搜索树简单,留意data的比较应该用abs(data)比较2.判断关键①条件1:根节点为黑,即 root->data <0②条件2:先遍历一次,若为红色节点,判断其左右孩子是否为红,若为红,输出No。③条件3:各点到叶结点的黑色节点数相同。用递归做,返回左子树的l1,返回右子树的l2,若l1!=l2,说明不平衡,输出No若l1等于l2,则把l1 + (当前是否为黑色点) 的值返回到上一层,即return当为空节点即黑色叶子节点时,返回1。3.易错点:因为一次有多个输入样例,故必须“重置树”和“重置标志符号flag”!************************//***********************笔记:1.关于树的新建问题,为了保险期间新建参数中命为 Node* &T,因为刚开始root是没有指向的。*********************/#define RH -1#define LH 1#define EH 0#define TRUE 1#define FALSE 0struct Node{int data;Node *lchild,*rchild;};struct Node *root;//必须为全局void insert(Node* &T,int data){if(T==NULL){T = (Node *)malloc(sizeof(Node));T->data=data;T->lchild=T->rchild=NULL;return ;}if(abs(data)<abs(T->data)){insert(T->lchild,data);}else insert(T->rchild,data);}bool flag;void juge1(Node *T){if(flag==false)return ;if(T->lchild!=NULL){if( T->data<0 && T->lchild->data<0){flag=false;return ;}else juge1(T->lchild);}if(T->rchild!=NULL){if( T->data<0 && T->rchild->data<0){flag=false;return ;}else juge1(T->rchild);}}int juge2(Node *T){int l1,l2;if(flag==false)return -1;if(T==NULL)return 1;l1=juge2(T->lchild);l2=juge2(T->rchild);if(l1!=l2){flag=false;return -1;}else{l1=l1 + (T->data>0);}return l1;}int main(){int k,n,data;scanf("%d",&k);while(k--){flag=true;root=NULL;scanf("%d",&n);while(n--){scanf("%d",&data);insert(root,data);}if(root->data<0)printf("No\n");else{juge1(root);if(flag==false){cout<<"No"<<endl;}else{juge2(root);if(flag==false)cout<<"No"<<endl;else cout<<"Yes"<<endl;}}}}
阅读全文
0 0
- PAT 1135. Is It A Red-Black Tree (30) 二叉搜索树建立 + 红黑树判断
- 【PAT 1135. Is It A Red-Black Tree (30)】& 二叉树
- 1135. Is It A Red-Black Tree (30)[红黑树判断]
- PAT甲级 1135. Is It A Red-Black Tree (30)
- PAT-1135 Is It A Red-Black Tree(二叉查找树的创建和遍历)
- 1135. Is It A Red-Black Tree (30) 红黑树
- 1135. Is It A Red-Black Tree (30)(判断红黑树)
- 1135. Is It A Red-Black Tree (30)-PAT甲级真题
- PAT甲级1135 Is It A Red-Black Tree
- 1135. Is It A Red-Black Tree (30)
- 1135. Is It A Red-Black Tree (30)
- 1135. Is It A Red-Black Tree (30)
- 1135. Is It A Red-Black Tree (30)
- pat1135 Is It A Red-Black Tree (30)(红黑树)
- PAT (Advanced Level) Practise 1135Is It A Red-Black Tree (30)
- PAT 1123. Is It a Complete AVL Tree (30) 平衡树构建+ 完全二叉树判断
- pat1123 Is It a Complete AVL Tree,平衡二叉树的建立,完全二叉树判断,层序
- hdu1325 Is It A Tree?(二叉树的判断)
- 四分树,紫书P160UVa297
- Learning Source Control with Git and SourceTree.pdf
- 面试(其他)
- 常见排序算法
- Linux下修改Mysql的用户(root)的密码
- PAT 1135. Is It A Red-Black Tree (30) 二叉搜索树建立 + 红黑树判断
- ACM周末总结—9月17日
- Codeforces Round #340 (Div. 2)
- 第四周 建设“单链表”算法库
- python学习2
- PAT-1132 Cut Integer (整数分割)
- [线段树] HDU 1754
- HDU1081 最大字段和 压缩数组
- angular js 日程安排表