- 论坛徽章:
- 0
|
我的第二个 proposal 的确不够简洁,但应该还是能实现的。
设计一个主递归函数: double_find (root, a, b, x); 中序遍历一棵树
其返回值 S00, S01, S10, S11 分别表示找不到, 找到了 b, 找到了 a, 找到 a, b
x 为节点指针的指针,如果找到所需的 parent 节点,则存放在 *x 中。 x 也可以换为一个全局变量。
再设计一个 single_find (root, a) 在找到其中一个的情况下找另一个。
代码类似这样
- #define S00 0x0;
- #define S01 0x1;
- #define S10 0x2;
- #define S11 0x3;
- double_find (root, a, b, x)
- {
- int rv, rv2;
- if (root == NULL)
- return S00;
- if (root == a) {
- rv = single_find (root->l, b)
- if (rv == 1) {
- *x = root;
- return S11;
- } else {
- rv = single_find (root->r, b);
- if (rv == 1) {
- *x = root;
- return S11;
- } else
- return S10;
- }
- }
-
- if (root == b) {
- ......
- }
- rv = double_find (root->l, a, b, x)
- switch (rv) {
- case S11:
- return S11;
- break;
- case S10:
- rv2 = single_find (root->r, b);
- if (rv2 == 1) {
- *x = root;
- return S11;
- } else
- return S10;
- break;
- case S01:
- ....
- case S00:
- rv2 = double_find (root->r, a, b, x);
- return rv2;
- break;
- default:
- }
-
- }
复制代码
由于并没有写出完整代码,所以无法调试,如果有 bug,请指出。谢谢。 |
|