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

问题:在一棵二叉树中,给定两个节点,求这两个节点的最低的公共祖先节点,如下图中的,节点 6 和 节点 9 的最低公共祖先节点是节点 5.

最容易联想到的是,这个问题似乎与公共子串的问题有关系,如果我们能求出两个节点到根节点的路径,再使用匹配算法得到公共的路径,取这个路径上最后一个节点,即是所求的最低公共祖先节点。

哈夫曼编码启迪了我,我打算使用 0 表示向左走,1 表示向右走。如,101 表示自根节点,走到右孩子 A,再走到 A 的左孩子 B,再走到 B 的右孩子 C 。于是,根节点到节点 C 的路径便可以使用整数 101 ,即 5 表示,基于这个思路,我们只需要用一个整数即可表示根节点到任何一个节点的路径(如果这个路径大于 32 ,我们可以考虑使用大整数,或者模拟一个大整数)。

想到了这一层,就没有什么难度了,我们只需要针对两个节点,分别求出根节点(如果题目要求的是自根节点开始算起)到这两个节点的路径,再求公共路径上最后一个节点即可。

给出源代码。

该题来源:

何海涛博客:http://zhedahht.blog.163.com/blog/static/25411174201081263815813/

该作者在文章中提到了两种解法,一种是递归的,如果两个节点都在当前节点的左子树,或者右子树中,那么,它们的最低公共祖先节点必然在左子树或者右子树中。如果分散在两个子树中,那么,当前节点就是最低公共祖先节点。

另一种与本文解法类似,只不过空间复杂度要高于本文解法。

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

时间: 2024-10-13 12:29:23

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

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

情形1:树是搜索二叉树 思路:从树的根节点开始遍历,如果根节点的值大于其中一个节点,小于另外一个节点,则根节点就是最低公共祖先.否则如果根节点的值小于两个节点的值,则递归求根节点的右子树,如果大于两个节点的值则递归求根的左子树.如果根节点正好是其中的一个节点,那么说明这两个节点在一条路径上,所以最低公共祖先则是根节点的父节点 public static BinaryTreeNode getLowestCommonAncestor(BinaryTreeNode rootParent,BinaryT

二叉树中任意两个节点的最近公共祖先节点

1.二叉树是个搜索二叉树 2.二叉树带有指向parent的指针 可转换成两个链表的相交节点 3.普通二叉树 保存从根节点分别到这两个节点的路径到list1和list2中 从list1和list2中找第一个不相等的节点即为最近公共祖先节点 template<class T> BinaryTreeNode<T>*  BinaryTree<T>::lastCommnParent(BinaryTreeNode<T>*& node1, BinaryTreeNo

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

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

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

从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

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

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

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

树是二叉查找树的情况 题目来自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

二叉树中两个结点最近的公共祖先汇总

一.若二叉树为搜索二叉树 原题链接:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/#/description Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of LCA on

求两个节点的最低公共祖先

tag: 二叉树 思路一: 分治 思路二:非递归??? package com.zhaochao.tree; /** * Created by zhaochao on 17/1/24. * lowest common ancestor */ public class LCA { // 在root为根的二叉树中找A,B的LCA: // 如果找到了就返回这个LCA // 如果只碰到A,就返回A // 如果只碰到B,就返回B // 如果都没有,就返回null public TreeNode LCARe

腾讯实习笔试编程题 满二叉搜索树求三个节点的最低公共祖先

题目 对于一棵满二叉搜索树深度为K,节点数为2^k - 1,节点值为[1, 2^k - 1].给出k和任意三个节点的值,输出包含该三个节点的最小子树的根节点值. 输入: 4 10 15 13 输出:12 思路 二分搜索,当搜索到节点x时,若x为三个节点之一或三个节点不在以x为根节点的树的子树的同一侧,则当前节点即为所求.否则二分 代码 1 import java.util.Scanner; 2 3 4 public class Main { 5 6 public static int binar