关闭

每天一道算法题(19)——最近公共父节点问题

标签: 最近公共父节点
635人阅读 评论(0) 收藏 举报
分类:

题目:     

     给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和最小。描述你程序的最坏时间复杂度,并实现具体函数,函数输入输出请参考如下的函数原型:

strucy TreeNode{
     TreeNode* left;   //指向左子树
     TreeNode* right;   //指向右子树
     TreeNode* father;   //指向父亲节点
};
TreeNode* LowestCommonAncestor(TreeNode* first,TreeNode* second){
}

方法1

     算法复杂度为O(n)。

     先查找高度。然后类似于查找两条链表第一个公共节点的方法进行遍历比较:

int getHeight(TreeNode *node) {
    int height = 0;
    while (node) {
        height++;
        node = node->parent;
    }
    return height;
}
 
TreeNode* LowestCommonAncestor(TreeNode* first,TreeNode* second) {
    int height1 = getHeight(first), height2 = getHeight(second), diff = height1 - height2;
    if (diff < 0) {
        diff = -diff;
        while(diff--) {
             second = second->parent;
        }
    } else {
        while(diff--) {
            first = first->parent;
        }
    }
    while (first != second) {//同步遍历
        first = first->parent;
        second = second->parent;
    }
    return first;
}


方法2:

    使用辅助存储空间。两个栈依次压入从该节点到根节点的指针。依次弹出栈比较节点。。

TreeNode* LowestCommonAncestor(TreeNode* first,TreeNode* second){
	if(!first||!second)
		return;
	if(first==second)
		return first;

	stack<node> s1;
	stack<node> s2;
	node t1,t2;

	while(!first){
		s1.push(first);
		first=first->father;
	}
	while(!second){
		s2.push(second);
		first=first->father;
	}
	while(!s1.empty()&&!s2.empty()){
                t1=s1.top();s1.pop();
		t2=s2.top();s2.pop();

		if(t1!=t2)
			return NULL;
		else if((t1==t2)&&!s1.empty()&&!s2.empty()&&(s1.top()!=s2.top()))//当前节点相等,下一级不相等
			return t1;
		else if((t1==t2)&&(s1.empty()||s2.empty()))//当前节点相等,下一级为空
			return t1;
	}	
	return NULL;
}


引申:

      考虑特殊情况,即二叉树为二叉查找数的情况:

TreeNode* LowestCommonAncestor(TreeNode* head,TreeNode* first,TreeNode* second){
	if(!first||!second)
		return;
	if(first==second)
		return first;

	if(first->value>second->value){
		TreeNode* t;
		t=first;
		first=second;
		second=first;
	}

	if(first->value>head->value)
		return LowestCommonAncestor(head->right,first,second);
	else if(second->value<head->value)
		return LowestCommonAncestor(head->left,first,second);
	else
		return head;
}









0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

微软面试题: 找出二叉树上任意两个结点的最近共同父结点。

找出二叉树上任意两个结点的最近共同父结点。       要求两节点的最近共同父节点(LCA,lowest common ancestor),可以采用树的后序遍历。如果这两个节点不在一条线上,则...
  • shixiaoguo90
  • shixiaoguo90
  • 2014-04-16 10:01
  • 1872

二叉树中两个节点的最近公共祖先节点

题目:求二叉树中两个节点的最近公共祖先节点 一、该二叉树为搜索二叉树 搜索二叉树的特点: 任意一个节点的左子树的所有节点值都比该节点的值小,其右子树的所有节点值都比该节点的值大。 解决该问题方法: 从...
  • xyzbaihaiping
  • xyzbaihaiping
  • 2016-08-04 23:43
  • 8807

在二叉树中找到两个节点的最近公共祖先

程序员代码面试指南(左程云)读书笔记 第三章 在二叉树中找到两个节点的最近公共祖先 题目:       给定一棵二叉树的头节点head,以及这棵二叉树的两个节点o1和o2,请返回o1和o2的...
  • qq_33323162
  • qq_33323162
  • 2016-08-30 17:21
  • 2050

算法题16 二叉树最近公共父节点

找寻二叉树中两个节点的公共父节点中最近的那个节点 情况1. 节点只有left/right,没有parent指针,root已知 解析:对于此种情形,只需找到两个节点到根节点的路径,然后就相当于两个链...
  • wcyoot
  • wcyoot
  • 2011-05-17 15:55
  • 4087

校招编程题(三) 二叉树问题之求子节点的最近公共父节点

摘要对某一满二叉排序树,输入四个数字。第1个为树的高度,后面3个为节点标号。求此三个节点的最近公共父节点。import java.util.Scanner;/*********************...
  • qq_24879495
  • qq_24879495
  • 2017-11-09 09:22
  • 46

求一颗不含指向父节点指针的普通树中任意两个结点的最近公共祖先(O(N*N) 和 O(N) 算法)

//方法1 来自剑指offer //#include //#include //#include //using namespace std; //#include "BinaryTree.h"...
  • ssopp24
  • ssopp24
  • 2017-06-29 15:51
  • 650

公共最近父节点(LCA)的O(n)算法

这个题目出现在MS公司的一次面试题当中。公共最近父节点,也叫公共最近祖先(Least Common Ancestors),就是寻找二叉书中,两个结点最近的祖先结点。 在网上查找资料的时候,看到有Ta...
  • naturebe
  • naturebe
  • 2012-08-21 14:49
  • 3734

程序员面试100题之十六:二叉树中两个节点的最近公共父节点

这个问题可以分为三种情况来考虑: 情况一:root未知,但是每个节点都有parent指针 此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,...
  • Hackbuteer1
  • Hackbuteer1
  • 2012-09-26 19:30
  • 17107

二叉树--最近公共父节点

给定二叉树中的任意两点,求解该两点的最近公共父节点。程序大致分为递归和非递归两种方式,下面我们先来认识非递归的方式。非递归程序总体的思路:用一种常见高效的数据结构来记录下二叉树中的结构关系,由于是找父...
  • wangxiaotongfan
  • wangxiaotongfan
  • 2016-05-24 17:54
  • 1823

二叉树最近公共父节点

#include using namespace std; struct TreeNode { int val; TreeNode*left; TreeNode*right;...
  • u012067392
  • u012067392
  • 2017-05-24 13:27
  • 85
    个人资料
    • 访问:199826次
    • 积分:3759
    • 等级:
    • 排名:第9913名
    • 原创:174篇
    • 转载:44篇
    • 译文:3篇
    • 评论:14条
    博客专栏
    最新评论