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

 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] == true) // 两节点都存在
 8             return lowestCommonAncestor(head, first, second);
 9         else
10             return null;
11     }
12
13     public static void travel(TreeNode head, TreeNode first, TreeNode second) {
14         if(head == null)
15             return;
16
17         if(head.value == first.value)
18             flag[0] = true;
19         if(head.value == second.value)
20             flag[1] = true;
21         travel(head.left, first, second);
22         travel(head.right, first, second);
23     }
24
25     public static TreeNode lowestCommonAncestor(TreeNode head, TreeNode first, TreeNode second) {
26         if (head == null)
27             return null;
28
29         // 先根遍历
30         if (head.value == first.value || head.value == second.value)
31             return head;
32         TreeNode left = lowestCommonAncestor(head.left, first, second);
33         TreeNode right = lowestCommonAncestor(head.right, first, second);
34         if ((left != null) && (right != null)) {
35             return head;
36         }
37         return left != null ? left : right;
38     }
39
40     public static void main(String[] args) {
41         TreeNode node1 = new TreeNode(1);
42         TreeNode node2 = new TreeNode(2);
43         TreeNode node3 = new TreeNode(3);
44         TreeNode node4 = new TreeNode(4);
45         TreeNode node5 = new TreeNode(5);
46         TreeNode node6 = new TreeNode(6);
47         TreeNode node7 = new TreeNode(7);
48         node1.left = node2;
49         node1.right = node3;
50         node2.left = node4;
51         node2.right = node5;
52         node4.right = node6;
53         TreeNode result = findLowestCommonAncestor(node1, node6, node5); // 2
54 //      TreeNode result = findLowestCommonAncestor(node1, node1, node2); // 1
55 //      TreeNode result = findLowestCommonAncestor(node1, node1, node7); // null
56
57         System.out.println(result != null ? result.value : result);
58     }
59 }
60
61 class TreeNode {
62     TreeNode left;
63     TreeNode right;
64     int value;
65
66     TreeNode(int value) {
67         this.value = value;
68     }
69 }
时间: 2024-12-28 00:38:42

查找二叉树两节点的最近公共父节点的相关文章

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

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

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

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

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

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

二叉树---最近公共父节点(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 =

LCA-最小公共父节点

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

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

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

#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

二叉树最近公共父节点

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

二叉树中任意两节点的最低共同父节点

通过两个和二叉树相关的算法题来看看和递归在二叉树中的应用 输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点. 思路: 如果这两个节点不在同一个子树下面,那么这棵树的根节点就是他们的共同最低父节点. 如果两个都在右子树,那么以右子树的最上面的那个节点作为根节点,重新进行判断,递归调用. 同理两个都在左子树,则方法同上.  也就是说,最终的结果分别只有三种情况,一个节点在右子树,一个节点在左子树.两个节点都在右子树,两个节点都在左子树. 如果是第一种情况,那么当前的节点就是他们最低的公共