求树中两个节点的最近公共祖先(版本2)

1.求树中两个节点的最近公共祖先(版本2) 
我们来看 这个问题 的 第二种解析思路
在第一种思路中, 我们将 这个题意理解为,这棵树是一颗二叉搜索树.
在第二种思路中, 我们将 这棵树, 理解为一颗普通的树, 或许它都不是二叉树, 不过这不重要(不过为了方便测试, 我们将用结点中含有指向父节点指针的二叉树进行测试  ---> 不过 ,这与用普同一棵树进行测试并没有本质的区别 )
在这次分析中, 我们假设 这颗树的节点中 含有 指向 父节点的指针
我们的解法是这样的:  我们借用两个 辅助栈 s1 和 s2 来解决这个问题。 将两个结点的 父节点分别 入 栈 s1 和 s2.  直到两个结点 入栈的 最后一个节点为 根节点(因为这两个结点属于 同一颗二叉树, 所以它们的根节点是相同的)
现在我们来思考,1. 两个栈 的栈顶 为同一个根节点.  2. 二叉树中 每个 结点 到根节点只有一条路径

此时, 我们依次从栈中 pop 数据, 从栈中最后一个 pop 的 相同的结点, 即为两个结点的最近公共祖先( 其实这种想法我已经在 求两个链表的第一个公共结点 这篇博客中提过, 在那篇博客中, 我们用三种方法来找到 两个链表的第一个公共结点, 我们这里所用的方法, 属于 那篇博客中的方法2, 如果看过那篇博客即可知道, 其实最好的解法是那篇博客中的方法3, 而不是我们现在所用的这种方法, 不过,那篇博客中并未实现方法2的代码, 为了实现一次这种代码, 我们这里采用方法2,在那篇博客中已经提到, 方法2 相比 方法3, 时间复杂度相同, 但方法2的空间复杂度更大 )


不管做哪道题, 千万不要忘了, 代码要考虑到 "空"的情况。  如空结点。

我们的二叉树中 不包含数值相同的 结点


#include <iostream>
#include <stack>
#include <windows.h>
using namespace std;
#include "BinaryTree.h"


template <typename T>
BinaryTreeNode<T>* FindFirstCommonNode( BinaryTreeNode<T>* node1, BinaryTreeNode<T>* node2 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值