二叉树两个结点的最低共同父结点 微信:318175542

入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。

分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至

少有两个变种。

第一变种是二叉树是一种特殊的二叉树:查找二叉树。也就是树是排序过的,位于

左子树上的结点都比父结点小, 而位于右子树的结点都比父结点大。 我们只需要从根结点开

始和两个结点进行比较。 如果当前结点的值比两个结点都大, 则最低的共同父结点一定在当

前结点的左子树中。 如果当前结点的值比两个结点都小, 则最低的共同父结点一定在当前结

点的右子树中。

第二个变种是树不一定是二叉树,每个结点都有一个指针指向它的父结点。于是我

们可以从任何一个结点出发, 得到一个到达树根结点的单向链表。 因此这个问题转换为两个

单向链表的第一个公共结点。

思路:现在我们回到这个问题本身。所谓共同的父结点,就是两个结点都出现在这个结点

的子树中。假如我们从头部开始遍历,一旦发现有节点和两个节点中的一个相等,那么此节点就是目标节点,要么公共父节点在左子树,要么在右子树。如果发现两个节点一个在左子树,一个在右子树,那么当前节点就是公共父节点,如果发现有都在右子树,那么公共父节点就在右子树,如果发现都在左子树,那么公共父节点在右子树

bool FindNode(BinTree* root,BinTree* node)
{
	if(root == NULL)
		return false;
	if(root == node)
		return true;
	return (FindNode(root->left,node) ||FindNode(root->right,node));
}
BinTree* LCP(BinTree* root,BinTree* first,BinTree* second)
{
	if(root == first || root == second)
		return root;
	bool isLeft = false;
	isLeft = FindNode(root->left,first);
	if(isLeft)
	{
		if(FindNode(root->left,second))
			return LCP(root->left,first,second);
		else
			return root;
	}
	else
	{
		if(FindNode(root->right,second))
			return LCP(root->right,first,second);
		else
			return root;
	}
}
时间: 2024-11-09 00:45:43

二叉树两个结点的最低共同父结点 微信:318175542的相关文章

【编程题目】二叉树两个结点的最低共同父结点

75.二叉树两个结点的最低共同父结点(树)题目:二叉树的结点定义如下:struct TreeNode{int m_nvalue;TreeNode* m_pLeft;TreeNode* m_pRight;};输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点. 思路:修改后序遍历 我的方法需要一个额外的整数n来标定. 开始想用非递归,结果写不出来... 只好用递归了.... /* 75.二叉树两个结点的最低共同父结点(树) 题目:二叉树的结点定义如下: struct TreeNode {

求解二叉树中两个结点的最低公共父结点

一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中某两个结点的最低公共父结点.借用一张图如下: 结点8 和 结点5 的最低公共父结点为 结点2 二,二叉树的构建 与 求二叉树中第K层结点的个数 文章中的第二点:二叉树构建相同 三,求解最低公共父结点的算法实现 有两种思路,一种是通过中序遍历和后序遍历.由于中序遍历是先左子树中的结点,再访问根,再访问右子树中结点,因此这两个结点的公共父结点一定处于这两个结点之间. 如:中序遍历:8, 4, 9, 2, 5, 1, 6, 3, 7  

二叉树两个结点的最低共同父节点

后序遍历就行. //寻找二叉树两个结点的最低共同父节点 TreeNode *FindFirstCommonParentNode(TreeNode *pRoot, TreeNode *pNodeOne, TreeNode *pNodeTwo) { if (NULL == pRoot) { return NULL; } if (pRoot == pNodeOne || pRoot == pNodeTwo) { return pRoot; } TreeNode *pLeft = FindFirstCo

【转】求二叉树两结点的最近共同父结点

求二叉树两结点的最近共同父结点,在网上看到了一个挺有意思的解法,原文在http://www.cnblogs.com/remlostime/archive/2012/11/26/2788795.html 一般思路是从子节点深度遍历到根节点,然后比较两个路径的分叉点.他用的递归: 1 struct Node 2 { 3 int val; 4 Node *left; 5 Node *right; 6 Node():left(NULL), right(NULL){} 7 }; 8 9 Node *fin

输出二叉树中随机两个结点的最小公共父结点

思路:当遇到一个结点是返回1,当左右子树都返回1的时候,即最小公共父节点. //二叉树的数据结构 typedef struct MyStruct { char data; struct MyStruct *leftChild; struct MyStruct *rightChild; }Node, *Tree; //查找方法 int findFirstFather(Tree root, char first, char second,char &destination){ int i, j; i

求二叉树中两个节点的最低公共父节点

必须通过遍历查找一个节点的祖先集合,然后比较两个节点的祖先集合就可以找到最低的那个.这里采用后序遍历,并传入一个栈记录该节点的祖先节点.在每次访问一个节点时,先把这个节点压入栈,然后判断该节点是不是要查找的那个节点,如果是返回.接着查找它的左子树和右子树,当要查找的节点在它的左右子树中则返回.然后判断该节点与栈顶节点是否相同,是则弹出栈顶元素.这是因为相同就代表了在访问它的左右子树时没有添加新的节点,也就是说要查找的那个节点不在它的左右子树中,则该节点也就是不是要查找的节点的祖先. #inclu

C++算法之 求二叉树两个节点的最低公共节点

方法1:递归方法: (1)如果两个节点分别在根节点的左子树和右子树,则返回根节点 (2)如果两个节点都在左子树,则递归处理左子树:如果两个节点都在右子树,则递归处理右子树 bool FindNode(BTree* pRoot, BTree* pNode) { if (pRoot == NULL || pNode == NULL) { return false; } if (pRoot == pNode) { return true; } bool found = FindNode(pRoot->

寻找二叉树两个节点的最低公共祖先

从root开始遍历,如果n1和n2中的任一个和root匹配,那么root就是LCA. 如果都不匹配,则分别递归左.右子树,如果有一个 key(n1或n2)出现在左子树,并且另一个key(n1或n2)出现在右子树,则root就是LCA.  如果两个key都出现在左子树,则说明LCA在左子树中,否则在右子树. /* 只用一次遍历解决LCA */ #include <iostream> using namespace std; struct Node { struct Node *left, *ri

求解二叉查找树中的最低公共祖先结点

一,问题描述 请构造一棵二叉查找树,并给定两个结点,请找出这两个结点的最低公共祖先结点. 这里假设二叉查找树中的结点的权值存储是整型数字(见代码中的BinaryNode内部类),最低公共祖先结点如下:结点5 和 结点12 的最低公共祖先结点是结点10 二,实现思路 假设给定的两个结点的权值分别为 node1 和 node2 如果根的权值处于 node1 和 node2 之间,则根就是它们的最低公共祖先结点 如果根的权值比 node1 和 node2 都大,则它们的最低公共祖先结点在根的左子树中