查找一个普通二叉树中两个节点最近的公共祖先。 方法: 1.分别找出两个节点距离根节点的路径并保存在栈中; 2.判断两个栈的长度是否相等,如果不相等,就pop()掉size()值较大的一个直到两个栈的长度相等。 3.分别取两个栈顶的元素,比较值是否相等,若不相等将两个栈顶元素都出栈 ,若相等,则返回栈顶元素。
using namespace std; template <class T> struct BinaryTreeNode//定义二叉树的节点 { BinaryTreeNode(const T& value) :_value(value) ,_pLeft(NULL) ,_pRight(NULL) {} T _value; BinaryTreeNode<T>* _pLeft; BinaryTreeNode<T>* _pRight; }; template<class T> class BinaryTree//定义二叉树 { typedef BinaryTreeNode<T> Node; public: BinaryTree() :_pRoot(NULL) {} private: Node* _pRoot;//根节点 };查找二叉树最近的公共祖先:
Node* FindCommonAncestorNode(Node* first, Node* second) { if(!_pRoot || !first || !second) return NULL; return _FindCommonAncestorNode(_pRoot, first, second); } void Stack(stack<Node*>& s, Node* _pRoot, Node* first)//求两个节点距离根节点的路径 { Node* pCur = _pRoot; Node* pPre = NULL; while(pCur || !s.empty()) { while(pCur) { s.push(pCur); pCur = pCur->_pLeft; } Node* pTop = s.top(); if(pTop->_pRight == NULL || pTop->_pRight == pPre) { if(pTop->_value == first->_value) break; s.pop(); pPre = pTop; } else pCur = pTop->_pRight; } } Node* _FindCommonAncestorNode(Node* _pRoot, Node* first, Node* second) { stack<Node*> s1; stack<Node*> s2; Stack(s1, _pRoot, first); Stack(s2, _pRoot, second); while(s1.size() > s2.size()) { s1.pop(); } while(s1.size() < s2.size()) { s2.pop(); } while(s1.top() != s2.top()) { s1.pop(); s2.pop(); } return s1.top(); }