【面试题】剑指Offer-50-求两个节点的最近公共祖先

来源:互联网 发布:js qq客服代码 编辑:程序博客网 时间:2024/06/11 22:52

题目概述

一颗二叉树,给出两个节点,求这两个节点的公共的祖先节点(要求的是离他们是最近的)


比如,6和8的公共节点为1,4,但是最近公共节点为4

解题思路

假设我们求6和8两个节点的公共祖先

我们可以遍历一遍二叉树,求出6和8分别的路径

6的路径Path1为1,4,5,6

8的路径Path2为1,4,8

这里我们用栈来保存该路径

这里比较Path1和Path2的大小

由于Path1比Path2的size大1

所以让Path1先出栈一个元素,结果为1,4,5

然后让Path1和Path2同时出栈,当他们的栈顶元素相同时

就是最近的公共祖先了

代码实现

//查找一个节点的路径//可以转换成节点指针bool FindPath(BTNode* root, int data, stack<int>& Path){if (root == NULL)return false;Path.push(root->data);if (root->data == data)return true;if (FindPath(root->left, data, Path))return true;if (FindPath(root->right, data, Path))return true;Path.pop();return false;}//认为x1,x2已经存在于root树中//int TheCommonNode(BTNode* root, BTNode* x1, BTNode* x2)//可以传指针,可以传数据,但是要保证数据不重复int TheCommonNode(BTNode* root, int x1, int x2){if (root == NULL)return NULL;assert(x1);assert(x2);stack<int> s1;stack<int> s2;/*FindPath(root, x1->data, s1);FindPath(root, x2->data, s2);*/FindPath(root, x1, s1);FindPath(root, x2, s2);int Size1 = s1.size();int Size2 = s2.size();if (Size1 > Size2){int tmp = Size1 - Size2;while (tmp--)s1.pop();}if (Size1 < Size2){int tmp = Size2 - Size1;while (tmp--)s2.pop();}while (1){if (s1.top() == s2.top())return s1.top();s1.pop();s2.pop();}assert(false);}


0 1
原创粉丝点击