zoukankan      html  css  js  c++  java
  • 树中两个结点的最低公共祖先--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;
    }
  • 相关阅读:
    idea使用之myeclipse项目迁移到idea
    启用Windows10的Linux子系统并安装图形界面
    Structs2+spring+hibernate+JPA整合
    微信小程序 跳转页面
    flutter 环境配置
    微信小程序 接口改为promise 由异步改为同步解决多层异步回调
    微信小程序 canvas绘制图片并下载
    微信小程序授权认证 操作
    html5 移动端页面软键盘弹出影响页面布局
    js移动端软件盘弹出隐藏处理
  • 原文地址:https://www.cnblogs.com/zy230530/p/7365207.html
Copyright © 2011-2022 走看看