Geeks LCA最低公共单亲节点

给出一颗二叉树,找到两个值的最小公共节点。

假设两个值都会在树中出现。如果可能不会出现的话,也很简单,就查找一遍看两个值是否在树中就可以了。如果不在就直接返回NULL。

基本思想:就是在二叉树中比较节点值和两个值的大小,如果都在一边(左边或者右边)那么就往下继续查找,否则就是都在同一边了,那么就可以返回这个节点了,这个节点就是最低公共单亲节点了。

参考:http://www.geeksforgeeks.org/lowest-common-ancestor-in-a-binary-search-tree/

#include <stdio.h>
#include <stdlib.h>

class LCABST
{
	struct Node
	{
		int data;
		Node *left, *right;
		Node(int d) : data(d), left(NULL), right(NULL) {}
	};
	Node *lca(Node *root, int n1, int n2)
	{
		if (!root) return NULL;
		if (n1 < root->data && n2 < root->data)
			return lca(root->left, n1, n2);
		if (root->data < n1 && root->data < n2)
			return lca(root->right, n1, n2);
		return root;
	}

	Node *lcaIter(Node *root, int n1, int n2)
	{
		while (root)
		{
			if (n1 < root->data && n2 < root->data)
				root = root->left;
			else if (root->data < n1 && root->data < n2)
				root = root->right;
			else break;
		}
		return root;
	}

	Node *root;
public:
	LCABST()
	{
		run();
	}

	void run()
	{
		// Let us construct the BST shown in the above figure
		root = new Node(20);
		root->left = new Node(8);
		root->right = new Node(22);
		root->left->left = new Node(4);
		root->left->right = new Node(12);
		root->left->right->left = new Node(10);
		root->left->right->right = new Node(14);

		int n1 = 10, n2 = 14;
		Node *t = lca(root, n1, n2);
		printf("LCA of %d and %d is %d \n", n1, n2, t->data);

		n1 = 14, n2 = 8;
		t = lca(root, n1, n2);
		printf("LCA of %d and %d is %d \n", n1, n2, t->data);

		n1 = 10, n2 = 22;
		t = lca(root, n1, n2);
		printf("LCA of %d and %d is %d \n", n1, n2, t->data);

		n1 = 10, n2 = 14;
		printf("\nIterative Run:\n");
		t = lcaIter(root, n1, n2);
		printf("LCA of %d and %d is %d \n", n1, n2, t->data);

		n1 = 14, n2 = 8;
		t = lcaIter(root, n1, n2);
		printf("LCA of %d and %d is %d \n", n1, n2, t->data);

		n1 = 10, n2 = 22;
		t = lcaIter(root, n1, n2);
		printf("LCA of %d and %d is %d \n", n1, n2, t->data);
	}
	~LCABST()
	{
		deleteTree(root);
	}
	void deleteTree(Node *r)
	{
		if (!r) return;
		deleteTree(r->left);
		deleteTree(r->right);
		delete r; r = NULL;
	}
};

Geeks LCA最低公共单亲节点

时间: 2024-10-14 19:14:20

Geeks LCA最低公共单亲节点的相关文章

LCA最小公共父节点的解题思路

LCA最小公共父节点解法: 1.二叉搜索树: 中序遍历是升序,前序遍历即按序插入建树的序列. 二叉搜索树建树最好用前序+中序,如果用前序建树,最坏情况会退化为线性表,超时. 最近公共祖先甲级: A1143,1151 利用二叉搜索树的性质寻找结点u和v的最低公共祖先(递归解法) 1)如果根结点的值大于max(u,v),说明u和v均在根结点的左子树,则进入根结点的左子结点继续递归 2)如果根结点的值小于min(u,v),说明u和v均在根结点的右子树,则进入根结点的右子结点继续递归 3)剩下的情况就是

二叉树中寻找共同节点的最低公共祖先节点

问题:在一棵二叉树中,给定两个节点,求这两个节点的最低的公共祖先节点,如下图中的,节点 6 和 节点 9 的最低公共祖先节点是节点 5. 最容易联想到的是,这个问题似乎与公共子串的问题有关系,如果我们能求出两个节点到根节点的路径,再使用匹配算法得到公共的路径,取这个路径上最后一个节点,即是所求的最低公共祖先节点. 哈夫曼编码启迪了我,我打算使用 0 表示向左走,1 表示向右走.如,101 表示自根节点,走到右孩子 A,再走到 A 的左孩子 B,再走到 B 的右孩子 C .于是,根节点到节点 C

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

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

二叉树(12)----查找两个节点最低祖先节点(或最近公共父节点等),递归和非递归

1.二叉树定义: typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.查找二叉树中两个节点的最低祖先节点(或最近公共父节点等) 最低祖

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->

求二叉树的最低公共祖先

这个题目来讲,应该是在二叉树里面较为容易的题目了.那么如何下手呢?其实对于这样一棵二叉树来讲. 我们如何求它们的最低公共父节点呢? 假如是要你求5.6的公共父节点,那么是3.啰 为什么是3? 因为3的左子树是5,而右子树是6啰. 那么7.8的最低公共祖先呢? 1啊,因为1的左子树中有7.而1的右子树中有8啊. 那么思路来了.我们只要证明某一节点的左子树和右子树分别包含这两个节点就行了. 于是思路来了. 源代码: 注意:在本题中为了方便 ,我们传入的两个节点的值,而不是两个节的地址,呵呵,为了方便

二叉树求两节点最低公共祖先,求随意两节点距离

-------1.求最低公共祖先LCA( Lowest Common Ancestor ) 什么是最低公共祖先?例如以下图.2与3的LCA是1:1与4的LCA是1:4与5的LCA是2. 那么给定两个节点n1和n2,如今要找出它们的LCA,怎样找?首先分析一下,n1和n2有几种情况?第一种.n1和n2分别在一个节点的左右子树中,比方4和5,LCA就是2,5和6,LCA就是1.2和3,LCA就是1:另外一种.n1和n2都在左子树或右子树,比方2和4,LCA就是2,1和4.LCA就是1. 一共这两种情

树中两个节点的最低公共祖先

树是二叉查找树的情况 题目来自LeetCode:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/ Lowest Common Ancestor of a Binary Search Tree Total Accepted: 3402 Total Submissions: 8709 My Submissions Question Solution Given a binary search t

二叉树节点个数,叶子个数,第K层个数,最低公共节点

1. 节点个数 function getNodeNum(root){ if(root == null){ return 0; } //+1为root的计数 return getNodeNum(root.left) + getNodeNum(root.right) + 1; } 2. 叶子个数 function getLeafNum(root){ if(root == null){ return 0; } if(root.left == null && root.right == null)