树中两个结点的最低公共祖先--java
题目:对于任意一个树,不仅仅限于二叉树,求树中两个结点的最低公共祖先结点。
解析:对于任意一棵树,显然并不局限于二叉树,也就是说树的非叶子结点可能存在多个子节点。所以,我们可以定义两个链表结构,存储这两个结点所在的树的路径,寻找结点路径的方法可以采用前序遍历的方法,当找到两个结点所在的路径之后,我们就可以比较两个链表的各个结点,当然我们可以从后先前遍历,这样找到两条路径中的第一个相同的结点,即为我们要找的最低公共祖先,只需将该结点返回即可。
class treeNode{
    int value;
    ArrayList<treeNode> childList;
    treeNode(int v){
        value=v;
        childList=new ArrayList<treeNode>();
    }
}
treeNode LeastCommonNode(treeNode root,treeNode node1,treeNode node2){
    treeNode cn = null;
    //存储路径
    ArrayList<treeNode> l1 = new ArrayList<treeNode>();
    ArrayList<treeNode> l2 = new ArrayList<treeNode>();
    //寻找结点路径函数
    boolean hasPath1 = getPath(root,node1,l1);
    boolean hasPath2 = getPath(root,node2,l2);
    if(hasPath1&&hasPath2){//两条路径均找到的情况下,才能比较
        int idx1 = l1.size()-1;
        int idx2 = l2.size()-1;
        while(idx1>=0&&idx2>=0){
            treeNode t1 = l1.get(idx1);
            treeNode t2 = l2.get(idx2);
            if(t1==t2){
                cn=t1;
                break;
            }
            idx1++;
            idx2++;
        }
    }
    return cn;
}
boolean getPath(treeNde root,treeNode node1,ArrayList<treeNode>list){
    boolean res = false;
    if(root==null){
        return false;
    }else{
        if(root==node1){
            list.add(root);
            return true;
        }
        list.add(root);
        for(int i=root.childList.size()-1;i>=0;i--){
            boolean found = getPath(root.childList.get(i),node1,list);
        }
        if(!found){
            list.remove(list.size()-1);
            return false;
        }
        res=found;
    }
    return res;
}
树中两个结点的最低公共祖先--java的更多相关文章
- 【剑指Offer学习】【面试题50:树中两个结点的最低公共祖先】
		
题目:求树中两个结点的最低公共祖先,此树不是二叉树,而且没有指向父节点的指针. 树的结点定义 private static class TreeNode { int val; List<Tree ...
 - 《剑指offer》第六十八题(树中两个结点的最低公共祖先)
		
// 面试题68:树中两个结点的最低公共祖先 // 题目:输入两个树结点,求它们的最低公共祖先. #include <iostream> #include "Tree.h&quo ...
 - (剑指Offer)面试题50:树中两个结点的最低公共祖先
		
题目: 求树中两个结点的最低公共祖先 思路: 考虑一下几种情况: 1.该树为二叉搜索树 二叉搜索树是排序树,位于左子树点的结点都比父结点小,而位于右子树的结点都比父结点大,只需要从树的根结点开始和两个 ...
 - 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先
		
剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...
 - 【剑指Offer面试编程题】题目1509:树中两个结点的最低公共祖先--九度OJ
		
题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数 ...
 - 【Java】 剑指offer(68) 树中两个结点的最低公共祖先
		
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入两个树结点,求它们的最低公共祖先. 思路 该题首先要和面试 ...
 - 【Offer】[68] 【树中两个结点的最低公共祖先】
		
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入两个树结点,求它们的最低公共祖先. [牛客网刷题地址]无 思路分析 该题首先要确定是否为二叉树,还要确定是否为二叉搜索树,是否有父指 ...
 - Lowest Common Ancestor of a Binary Search Tree(树中两个结点的最低公共祖先)
		
题目描述: Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in ...
 - [jobdu]树中两个结点的最低公共祖先
		
http://ac.jobdu.com/problem.php?pid=1509 此题最直观的方法是两次DFS,分别找到这两个节点的path,然后遍历path1和path2做比较,找到最后一个共同的元 ...
 
随机推荐
- 【洛谷3275】[SCOI2011] 糖果(差分约束系统入门题)
			
点此看题面 大致题意: 有\(N\)个小朋友,要求每个人都得到糖果,且每个人的糖果总数满足一定的关系式,请你求出至少共分给小朋友们多少糖果. 关系式的转换 首先,我们可以将题目中给定的式子进行转换: ...
 - 在O(1)时间复杂度删除链表节点
			
题目描述: 给定一个单链表中的一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点. 您在真实的面试中是否遇到过这个题? Yes 样例 给定 1->2->3-> ...
 - cout对象一些常用方法的总结
			
cout.precision(n); 这个方法的功能是,设置精度为n,返还值是上一次的设置精度. #include <iostream> using namespace std; int ...
 - java: 非法字符: \65279
			
IDEA导入项目后,编译的时候出现Error:(1, 1) java: 非法字符: \65279: 修改:找到编译报错的文件,用Notepad++工具,以UTF-8无BOM格式编码保存,然后重新编译即 ...
 - 博学谷-数据分析matplotlib
			
博学谷-数据分析 python数学学科的基础 机器学习课程的基础 1.1 介绍 1.2 jupyter和conda 1.3 matplotlib from matplotlib import pypl ...
 - mysql 绿色版 安装
			
1.下载mysql的绿色版压缩包.(自行百度) 2.自行规划目录解压 3.安装 注意:我遇到的两种版本的安装方法(暂时按照解压后的目录中是否含有data目录来区分) 3.1 无data目录(我用到的的 ...
 - 微信小游戏 demo 飞机大战 代码分析 (三)(spirit.js, animation.js)
			
微信小游戏 demo 飞机大战 代码分析(三)(spirit.js, animation.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码 ...
 - 为什么选择Redis
			
1)Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储. 2)Redis支持master-slave(主-从)模式应用 3)Redi ...
 - JZOJ 3493. 【NOIP2013模拟联考13】三角形
			
3493. [NOIP2013模拟联考13]三角形(triangle) (File IO): input:triangle.in output:triangle.out Time Limits: 10 ...
 - linux 基本指令 归类
			
今天 我们来学习一下 最最基础的linux 指令,在我看来 linux的操作就是 增 删 改 查 这四个字. 1 查询 操作用户 woami 2查询登录用户 who am i 2 pwd //查询当前 ...