算法2013110501

来源:互联网 发布:淘宝商家培训 编辑:程序博客网 时间:2024/05/18 02:38

题设:求二叉树中两个节点的最近的公共父节点。

解法:记根节点为R,另两个节点为X、Y。记从R到X的路径P;从R到Y的路径为Q。则P与Q重叠部分的末端节点即为问题的解。

#include <vector>#include <cassert>  struct Node {      Node    *m_left;      Node    *m_right;      int     m_data;  };  bool isReachable(const Node *src, const Node *dst, std::vector<const Node*> *routine) {assert(dst && (src != dst) && routine);if (!src) {return false;}if ((src->m_left == dst) || (src->m_right == dst)|| isReachable(src->m_left, dst, routine)|| isReachable(src->m_right, dst, routine)) {routine->push_back(src);return true;}return false;}  bool findRoutine(const Node *root, const Node *dst, std::vector<const Node*> *routine) {assert(root && dst && (root != dst));assert(routine->empty());std::vector<const Node*> reversed;if (!isReachable(root, dst, &reversed)) {assert(reversed.empty());return false;}assert(!reversed.empty());for (std::vector<const Node*>::const_reverse_iterator it = reversed.rbegin(); it != reversed.rend(); ++it) {routine->push_back(*it);}return true;}const Node* commonParent(const Node *one, const Node *another, const Node *root) {assert(one && another && root);assert((one != another) && (one != root) && (another != root));std::vector<const Node*> routineOne;if (!isReachable(root, one, &routineOne)) {return 0;}std::vector<const Node*> routineAnother;if (!isReachable(root, another, &routineAnother)) {return 0;}const Node *result = 0;std::vector<const Node*>::const_iterator itOne = routineOne.begin();std::vector<const Node*>::const_iterator itAnother = routineAnother.begin();while ((itOne != routineOne.end()) && (itAnother != routineAnother.end())) {if (*itOne != *itAnother) {break;}result = *itOne;++itOne;++itAnother;}return result;}
设节点的数目为N,则算法的时间复杂度为O(N)