剑指offer68---二叉树最近的公共祖先

目录

一、方法1

二、方法2


剑指 Offer 68 - II. 二叉树的最近公共祖先 - 力扣(LeetCode)

剑指offer68-给定二叉树的两个节点node1和node2,找到他们的最低公共祖先节点

例如5和1的最低公共祖先节点为3;4和6的最低公共祖先节点为5 

一、方法1

用哈希表记录整棵树的父节点信息,并且用一个set容器将其中一个节点的父节点全放在set中,然后遍历另外一个节点的父节点,查是否在set容器中,如果有就返回此时的父节点

	BinaryNode* lowestCommonAncestor(BinaryNode* headnode, BinaryNode* node1, BinaryNode* node2) {
		unordered_map<BinaryNode*, BinaryNode*> fatherMap;
		fatherMap.insert(make_pair(headnode, headnode));
		process(headnode, fatherMap);
		set<BinaryNode*> set1;
		BinaryNode* cur1 = node1;
		while (cur1 != fatherMap[cur1]) {
			set1.insert(cur1);
			cur1 = fatherMap[cur1];
		}
		set1.insert(headnode);
		BinaryNode* cur2 = node2;
		while (!set1.count(cur2)) {
			cur2 = fatherMap[cur2];
		}
		return cur2;
	}

	void process(BinaryNode* headnode, unordered_map<BinaryNode*, BinaryNode*> fatherMap) {
		if (headnode == nullptr) {
			return;
		}

		fatherMap.insert(make_pair(headnode->m_left, headnode));
		fatherMap.insert(make_pair(headnode->m_right, headnode));

		process(headnode->m_left, fatherMap);
		process(headnode->m_right, fatherMap);
	}

二、方法2

分析节点可能出现的情况

第一种:node1和node2在同一边,谁在上面谁就是祖父节点

第二种:node1和node2不在同一边

	BinaryNode* lowestCommonAncestor(BinaryNode* headnode, BinaryNode* node1, BinaryNode* node2) {
		if (headnode == nullptr || headnode == node1 || headnode == node2) {
			//相当于找node1,和node2,找不到就返回nullptr
			//并且如果node1和node2同时在左边或者同时在右边,谁在上面谁就是祖父节点
			return headnode;
		}

		BinaryNode* left = lowestCommonAncestor(headnode->m_left, node1, node2);
		BinaryNode* right = lowestCommonAncestor(headnode->m_right, node1, node2);

		//node1和node2不在同一边,所以headnode就是祖父节点
		if (left != nullptr && right != nullptr) {
			return headnode;
		}

		//左右两棵树并不都有返回值,那边有返回值就是祖父节点
		return left != nullptr ? left : right;
	}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值