二叉树---最近公共父节点(LCA)

题目:

给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。

最近公共祖先是两个节点的公共的祖先节点且具有最大深度。

  4
 / 3   7
   /   5   6

LCA(3, 5) = 4

LCA(5, 6) = 7

LCA(6, 7) = 7

Java代码:

 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode A, TreeNode B) {
        // write your code here
        if(root == null||root == A||root == B){
            return root;
        }
        //分而
        TreeNode left = lowestCommonAncestor(root.left, A, B);//这里主要用来找根节点子树是否有A或B节点;因为有可能A或B在一侧或者各自在一侧,这是都有可能的。
        TreeNode right = lowestCommonAncestor(root.right, A, B);
        //治之
        if(left!=null&&right!=null){   //如果这个节点不是A或B的话就返回该节点,然后继续往下搜索
            return root;
        }
        if(left!=null){
            return left;
        }
        if(right != null){
            return right;
        }
        return null;
    }
时间: 2024-12-22 02:40:08

二叉树---最近公共父节点(LCA)的相关文章

笔试算法题(24):找出出现次数超过一半的元素 & 二叉树最近公共父节点

出题:数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数字: 分析: 解法1:首先对数组进行排序,时间复杂度为O(NlogN),由于有一个数字出现次数超过了数组的一半,所以如果二分数组的话,划分元素肯定就是这个数字: 解法2:首先创建1/2数组大小的Hash Table(哈希表可以替代排序时间,由于一个数字出现超过了数组的一半,所以不同元素个数肯定不大于数组的一半),空间复杂度O(N),顺序扫描映射数 组元素到Hash Table中并计数,最后顺序扫描Hash Table,计数超过数组

二叉树最近公共父节点

在二叉树中找最近公共父节点.分为两种情况,一种是有父指针,一种没有父指针. 1.有父指针 这种情况比较简单,计算两个结点的深度,再把深度大的向上移,移到同一深度.在同时向上移动,直到两个结点相同,这样便找到了父节点.这个算法时间复杂度为O(N). 代码实现: #include<iostream> struct Node { int data; Node* left; Node* right; Node* parent; Node() :left(NULL), right(NULL), pare

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

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

二叉树递归与非递归遍历,最近公共父节点算法

#include <iostream> #include <stack> using namespace std; #define MAX 100 //字符串最大长度 typedef struct Node //二叉树结点 { char data; Node *lchild,*rchild; } *Btree; void createBT(Btree &t); //先序构造二叉树 void preorder(Btree &t); //二叉树递归先序遍历 void i

二叉树(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.查找二叉树中两个节点的最低祖先节点(或最近公共父节点等) 最低祖

查找二叉树两节点的最近公共父节点

1 //查找一棵树中最近公共父节点 2 public class LCA { 3 static boolean flag[] = new boolean[2];; 4 5 public static TreeNode findLowestCommonAncestor(TreeNode head, TreeNode first, TreeNode second){ 6 travel(head, first, second); 7 if(flag[0] == true && flag[1] =

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

这是京东周六的笔试题目   当时不在状态,现在想来肯定是笔试就被刷掉了,权当做个纪念吧.  这个问题可以分为三种情况来考虑: 情况一:root未知,但是每个节点都有parent指针此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,这个方法很简单,不需要详细解释的. 情况二:节点只有左.右指针,没有parent指针,root已知思路:有两种情况,一是要找的这两个节点(a, b),在要遍历的节点(root)的两侧,那么这个节点就是这两个节点的最

LCA-最小公共父节点

有一个普通二叉树,AB分别为两个子节点,求AB最近(深度最大)的公共父节点. 此题仍然是一个老题,有着多种解决方法,本文针对其中三种方法来进行分析总结. 这三种方法分别是:递归法,tarjan离线算法,RMQ在线算法. 递归法 递归法比较直观简单,思路如下: 首先判定当前节点root是否是A节点或者B节点,若是的话直接返回该节点 若不是,分别对root节点的左右子树进行递归查找最小公共父节点,若左右子树都返回了节点,那么表示当前节点就是最小公共父节点,若只有其中一个子树返回了结果,那么就返回该结

腾讯笔试题:满二叉排序树,任给3个子节点,找他们最大的公共父节点

腾讯笔试题出现了和这个类似的题目,没做出来,现在来好好解决这个问题吧,先从基本的开始. 先吐槽一下:感觉算法设计什么的,真的超级难,也许是我头脑太笨,转不过弯来吧,呵呵. 题目是这样的:一棵满二叉排序树,有K层,节点的值依次为 1~2k-1.现在告诉你树的高度是4层,给定你3个节点,比如9,11, 13,那么最大的公共父节点是12. 现在想起来这题我已经想出来一半了呀,但是大概人在紧张的时候大脑会思维短路,跳不出原有的思维陷阱.想法是这样的: 1. 首先是从根节点开始,如果给的三个叶节点的值其中