题目:二叉树的结点定义如下:
struct TreeNode
{
int m_nvalue;
TreeNode* m_pLeft;
TreeNode* m_pRight;
};
输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。
分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。
第一变种是二叉树是一种特殊的二叉树:查找二叉树。也就是树是排序过的,位于左子树上的结点都比父结点小,而位于右子树的结点都比父结点大。我们只需要从根结点开始和两个结点进行比较。如果当前结点的值比两个结点都大,则最低的共同父结点一定在当前结点的左子树中。如果当前结点的值比两个结点都小,则最低的共同父结点一定在当前结点的右子树中。
第二个变种是树不一定是二叉树,每个结点都有一个指针指向它的父结点。于是我们可以从任何一个结点出发,得到一个到达树根结点的单向链表。因此这个问题转换为两个单向链表的第一个公共结点。
这个题:
从根结点开始,判断以当前结点为根的树中左右子树是不是包含我们要找的两个结点。如果两个结点都出现在它的左子树中,那最低的共同父结点也出现在它的左子树中。如果两个结点都出现在它的右子树中,那最低的共同父结点也出现在它的右子树中。如果两个结点一个出现在左子树中,一个出现在右子树中,那当前的结点就是最低的共同父结点
代码写不出见这里:
http://zhedahht.blog.163.com/blog/static/25411174201081263815813/
如果结点中有一个指向父结点的指针,我们可以把问题转化为求两个链表的共同结点。现在我们可以想办法得到这个链表
bool GetNodePath(TreeNode* pHead, TreeNode* pNode, std::list<TreeNode*>& path)
{
if(pHead == pNode)
return true;
path.push_back(pHead); //这个寻找的结点在左孩子或者右孩子上,那么他是孩子的父亲
bool found = false;
if(pHead->m_pLeft != NULL)
found = GetNodePath(pHead->m_pLeft, pNode, path);
if(!found && pHead->m_pRight) //不是左孩子,那么就去右边找
found = GetNodePath(pHead->m_pRight, pNode, path);
if(!found) // 既不是左孩子又不是右孩子,就滚出来
path.pop_back();
return found;
}
分享到:
相关推荐
面试题12:能否用两个栈实现一个队列的功能 10.5 二叉树 面试题13:建立一个二叉树 面试题14:计算一棵二叉树的深度 面试题15:在二元树中找出和为某一值的所有路径 第11章 排序 11.1 插入排序 面试题1:编码实现...
- 二元查找树是一种特殊的二叉树,其中每个节点的值都大于其左子树中的任何节点的值,并且小于其右子树中的任何节点的值。 - **特点:** - 二元查找树的中序遍历结果是升序序列。 - 由于二元查找树具有上述性质,...
- **找出排序二叉树上任意两个结点的最近公共父结点**: 通过自顶向下的搜索方式找到这两个结点的最近公共祖先。 - **复制二叉树**: 通过深度优先搜索的方式,创建新的节点并建立相同的连接关系。 以上就是针对...
8. 如何找出排序二叉树上任意两个结点的最近共同父结点 9. 如何复制二叉树 数组篇 1. 如何找出数组中唯一的重复元素 2. 如何查找数组中元素的最大值和最小值 3. 如何找出旋转数组的最小元素 4. 如何找出数组中出现...
根据给定文件的信息,我们可以提炼出一系列与程序员笔试面试相关的知识点。下面将详细解析这些知识点。 ### 数据结构 1. **非线性数据结构** - **知识点**: 数据结构可以分为线性和非线性两大类。线性数据结构中...
前端大厂最新面试题-树 本文将详细介绍树形数据结构在计算机领域中的应用,包括树的定义、分类、遍历方法等。 一、树的定义和分类 树是一种非线性数据结构,可以表示数据之间的一对多关系。以树和二叉树最为常用...
16. 共享存储空间的两个栈可以节省空间,并降低上溢的可能性,因为它们可以交替使用存储空间。 17. 打印作业通常会被放入一个打印队列,等待打印机空闲时按照先来先服务的原则进行打印。 18. 队列的操作特点是...
二叉查找树是一种特殊的二叉树,其中每个结点包含一个键值和两个分别指向左子树和右子树的指针。对于任意一个结点来说,其左子树中的所有结点的键值都小于该结点的键值,而其右子树中的所有结点的键值都大于该结点的...
本题“面试题32-II. 从上到下打印二叉树II”是一道关于二叉树层次遍历的问题,难度为简单。下面将详细解析这个问题及其解决方案。 ### 一、题目描述 题目要求我们从上到下(自顶向下)地打印二叉树的每一层节点,...
- 每个节点占用 4 字节,前两个字节是节点值,后两个字节分别是左指针和右指针。 - **答案解析**: - (1) 根据题目描述,前序遍历可能的一种情况是 EABCFD,因此正确选项为 C。 - (2) 层次遍历的结果同样是 EABCFD,...
每日刷题计划,记录做过的题目,内容包含剑指offer、程序员面试金典(CTCI)、数据结构 下面标题括号内的为对应包名 剑指offer(offer) java实现 03二维数组中的查找 04替换空格 05从尾到头打印链表 06重建二叉树 07用...
腾讯笔试题精选二涉及的知识点涵盖了C/C++编程语言中函数的默认参数、函数重载、函数调用合法性、数据结构、算法稳定性、栈操作、进程管理、类成员变量、类型转换、程序运行结果分析等多个方面。具体知识点如下: 1...
3. 树和图:如重建二叉树,二叉树的下一个结点,用两个栈实现队列,矩阵中的路径,二叉树的镜像,对称的二叉树等。 4. 栈和队列:例如实现包含min函数的栈,栈的压入、弹出序列等。 5. 链表:包括链表中倒数第K个...
【C语言笔试题汇总整理】 在C语言的笔试题中,常常会涉及到内存管理、程序设计模式、数据结构以及数据库操作等...以上是C语言笔试题中涉及的一些关键知识点,理解和掌握这些内容对于应对C语言的笔试和面试至关重要。
36. 两个链表的第一个公共结点:找出两个链表相交的第一个节点。 37. 数字在排序数组中出现的次数:找出在排序数组中给定数字出现的次数。 38. 二叉树的深度:计算二叉树的最大深度。 39. 平衡二叉树:判断一个...