【面试题】剑指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
- 【面试题】剑指Offer-50-求两个节点的最近公共祖先
- 面试题50:求二叉树中两个节点的最近公共祖先
- [剑指offer][面试题50]树中两个节点的最低公共祖先
- 剑指Offer:面试题50 树中两个节点的最低公共祖先
- 剑指offer 面试题50—树中两个节点的最低公共祖先
- 剑指offer 面试题50 树中两个节点的最低公共祖先
- ~求两个节点的最近公共祖先~
- 求两个节点最近的公共祖先
- 求两个节点的最近公共祖先节点
- 求两个节点的最近公共祖先节点
- 求两个节点的最近公共祖先节点
- 求两个节点的最近公共祖先节点
- 如何求树中的两个节点的最近公共祖先?
- 求二叉树中两个节点的最近公共祖先
- 求二叉树中两个节点的最近公共祖先
- 求二叉树中两个节点的最近公共祖先
- 求二叉树中两个节点的最近公共祖先
- 求二叉树中两个节点的最近公共祖先
- PRML读书笔记——线性回归模型
- c++运算符重载的方法提要
- 选项卡控制器(tabBarController)基础
- 写给初学者22_android_百分比布局
- 二分图的最大匹配——匈牙利算法
- 【面试题】剑指Offer-50-求两个节点的最近公共祖先
- 二叉树的基本操作(严蔚敏)
- 深入理解LayoutInflater.inflate()
- JVM内存模型
- redis高级实用特性
- Python针对特定服务定制的代理工具V2.0------(zipdeal.py)
- Android--推送机制实现原理(四)-自己实现推送功能--心跳包
- ARM指令集发展概述
- ubuntu server 在hyper-v下连接网络