题目:EPI
书上的代码我认为有错。我的代码如下所示,时间复杂度为O(h),h为二叉树的高度。
//该函数不允许r和s为nullptr,且要求r、m、s三个指针互不相等 bool is_r_s_descendant_and_ancestor(shared_ptr<treenode> r, shared_ptr<treenode> m, shared_ptr<treenode> s) { if (m == nullptr || r == nullptr || s == nullptr) return false; shared_ptr<treenode> cur_r = r, cur_s = s, cur_m = m; bool is_r = false, is_s = false;//is_r代表着m是不是r的后代,<span style="font-family: Arial, Helvetica, sans-serif;">is_s代表着m是不是s的后代</span> //从r和s开始,同时向下寻找m while (cur_r && cur_s) { if (cur_r == m) { is_r = true; break; } if (cur_s == m) { is_s = true; break; } cur_r = cur_r->data > m->data ? cur_r->left : cur_r->right; cur_s = cur_s->data > m->data ? cur_s->left : cur_s->right; } if (!is_r && !is_s)//两个都没找到m { while (cur_r) { if (cur_r == m) { is_r = true; break; } cur_r = cur_r->data > m->data ? cur_r->left : cur_r->right; } while (cur_s) { if (cur_s == m) { is_s = true; break; } cur_s = cur_s->data > m->data ? cur_s->left : cur_s->right; } if (!is_r && !is_s)//仍然没有找到 return false; } if (is_r)//r的后代里有m { //判断m是不是s的祖先 while (cur_m) { if (cur_m == s) return true; cur_m = cur_m->data > s->data ? cur_m->left : cur_m->right; } return false; } if (is_s) { while (cur_m) { if (cur_m ==r) return true; cur_m = cur_m->data > r->data ? cur_m->left : cur_m->right; } return false; } }
原文地址:http://blog.csdn.net/bupt8846/article/details/42835071