赞
踩
目录
- typedef struct RBTnode
- {
- int data;
- bool color; // 0 for black, 1 for red
- RBTnode *lchild, *rchild;
- int left, right, it;
- } * RBTree, Node, *node;
通过任意顺序遍历一次,如果是红色,就判断子结点是否为黑色
对于结点4
左右子树到叶均有一个黑(left,right为1)
自己为红(it等于left或right等于1)
对于结点5
左右子树到叶均有一个黑(left,right为1)
自己为黑(it等于left或right加一,等于2)
对于结点1
左右子树到叶均有一个黑(left,right为1)
自己为黑(it等于left或right加一,等于2)
对于结点2
左右子树到叶均有两个黑(left,right为2)
自己为红(it等于left或right等于2)
综上所述,只需要先判断根是否为黑,再后序遍历一遍,即可判断是否为红黑树
- void No()
- {
- system("cls");
- printf("No\n");
- exit(0);
- }
-
- void judge(node x)
- {
- if (x->color) //根为红
- No();
- post_order_t(x);
- system("cls");
- printf("Yes\n");
- }
-
- void post_order_t(node x)
- {
- if (!x)
- return;
- post_order_t(x->lchild);//左
- post_order_t(x->rchild);//右
-
- //判断红色节点的子节点是否为黑
- if (x->color)
- {
- if (x->rchild)
- if (x->rchild->color)
- No();
- if (x->lchild)
- if (x->lchild->color)
- No();
- }
-
- //判断左右有几黑
- if (x->lchild)
- x->left = (x->lchild->it);
- else
- x->left = 1;
- if (x->rchild)
- x->right = (x->rchild->it);
- else
- x->right = 1;
- if (x->left == x->right)
- x->it += x->left;
- else
- No();
- }
首先要搞清楚,一共要判断哪些东西,比如,该题要先判断红结点的子结点颜色,可以用任意顺序遍历,但不用着急写实现。另一个在判断内容后,发现需要后序遍历,都研究好之后,可以用一次后序遍历处理掉所有问题。
其次是善于运用bool型变量,将1和0与实际需求联系起来,比如在判断红结点的子节点是否为黑时,更多需要的是判断某个结点是否为红
- //判断红色节点的子节点是否为黑
- if (x->color)
- {
- if (x->rchild)
- if (x->rchild->color)
- No();
- if (x->lchild)
- if (x->lchild->color)
- No();
- }
此时,1代表红,0代表黑就可以很好的利用起来
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。