树中两个结点的最低公共祖先--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;
}

 

posted @ 2017-08-15 15:10 笨鸟多学 阅读(...) 评论(...) 编辑 收藏