您的位置:首页 > 编程语言 > Java开发

树中两个结点的最低公共祖先--java

2017-08-15 15:10 295 查看
题目:对于任意一个树,不仅仅限于二叉树,求树中两个结点的最低公共祖先结点。

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: