題目:對於任意一個樹,不單單限於二叉樹,求樹中兩個結點的最低公共祖先結點。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; }