樹中兩個結點的最低公共祖先--java

題目:對於任意一個樹,不單單限於二叉樹,求樹中兩個結點的最低公共祖先結點。node

解析:對於任意一棵樹,顯然並不侷限於二叉樹,也就是說樹的非葉子結點可能存在多個子節點。因此,咱們能夠定義兩個鏈表結構,存儲這兩個結點所在的樹的路徑,尋找結點路徑的方法能夠採用前序遍歷的方法,當找到兩個結點所在的路徑以後,咱們就能夠比較兩個鏈表的各個結點,固然咱們能夠從後先前遍歷,這樣找到兩條路徑中的第一個相同的結點,即爲咱們要找的最低公共祖先,只需將該結點返回便可。函數

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;
}
相關文章
相關標籤/搜索