二叉树给定两个节点,找出他们最低公共祖先节点

思路:

先找出所有元素的父节点,使用HashMap进行存储。

找出一个节点的父节点的结合。使用HashSet进行存储。

然后另外一个节点就从下到上依次找每个父节点,看另一个父节点集合中是否包含此节点,如果包含就输出。

	public static NodeTwo findLowNode(NodeTwo head,NodeTwo node1,NodeTwo node2) {
		HashMap<NodeTwo,NodeTwo> fatherMap = new HashMap<NodeTwo,NodeTwo>();
		//所有节点的父节点都有了,只有头结点没有加进去,头结点的父节点就是自己
		fatherMap.put(head,head);
		process(fatherMap,head);
		HashSet<NodeTwo> set1 = new HashSet<NodeTwo>();
		NodeTwo cur = node1;
		//将一个节点的父节点全部找出。
		while(cur!=fatherMap.get(cur)){
			set1.add(cur);
			cur = fatherMap.get(cur);
		}
		set1.add(head);
		cur = node2;
		//另一个节点的父节点从下到上进行查询是否包含即可。
		while(cur!=fatherMap.get(cur)) {
			if(set1.contains(cur)) {
				return cur;
			}
			cur = fatherMap.get(cur);
		}
		
		
		return head;
	}
	//找出所有节点的父节点
	public static void process(HashMap<NodeTwo,NodeTwo> fatherMap,NodeTwo head) {
		if(head == null) {
			return ;
		}
		fatherMap.put(head.left, head);
		fatherMap.put(head.right,head);
		
		process(fatherMap,head.left);
		process(fatherMap,head.right);
	}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值