题目:对于任意一个树,不仅仅限于二叉树,求树中两个结点的最低公共祖先结点。
解析:对于任意一棵树,显然并不局限于二叉树,也就是说树的非叶子结点可能存在多个子节点。所以,我们可以定义两个链表结构,存储这两个结点所在的树的路径,寻找结点路径的方法可以采用前序遍历的方法,当找到两个结点所在的路径之后,我们就可以比较两个链表的各个结点,当然我们可以从后先前遍历,这样找到两条路径中的第一个相同的结点,即为我们要找的最低公共祖先,只需将该结点返回即可。
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; }