找寻二叉树中两个节点的公共父节点中最近的那个节点

来源:互联网 发布:特里斯坦·汤普森数据 编辑:程序博客网 时间:2024/05/22 02:21

 情况1. 节点只有left/right,没有parent指针,root已知

情况2. root未知,但是每个节点都有parent指针

情况3. 二叉树是个二叉查找树,且root和两个节点的值(a, b)已知

 

 

如果每个节点包含父亲指针,把两个节点到根的路径都记录下来,两条路径的最后面的元素肯定相同,从两条路径的最后一个元素向前比较,直到第一次出现分叉为止,就可以找到最近节点。复杂度为O(n),路径最长可能是n。如果不包含父亲节点,那就先前序遍历二叉树,遍历的时候可以像哈夫曼树那样左右01编号,记录给定两节点的到达路径,最后比较两个0,1序列的前面位数,直到出现不相等为止,就找到最近父节点,复杂度也是O(n)

 

情况3. 二叉树是个二叉查找树,且root和两个节点的值(a, b)已知

   Node findLowestCommonAncestor(Node root,
                   
int value1, int value2){
     
while( root!=null){
       
int value = root.getValue();
       
if (value>value1 && value>value2) {
            root
= root.getLeft();
       
}
       
else if (value<value1 && value<value2) {
            root
= root.getright();
       
}
       
else {
           
return root;
       
}
     
}
 
}

 

原创粉丝点击