1.求树中两个节点的最近公共祖先
这个问题按 对题意解析思路 的不同, 可以有许多的变种问题 和 解决思路
首先我们来看比较简单的一种: 如果这颗树是 二叉搜索树( 假设这个二叉搜索树中没有两个值相同的结点, 并且我们 考虑的这两个结点不是空结点 )
根据二叉搜索树的性质( 左子树的值都比根节点小, 右子树的值都比根节点大 )
我们的思路为: 从根节点开始, 如果两个节点的值 都比当前节点(此时为根节点)小, 则 它们的 最低公共祖先在 当前节点的左子树中, 否则在 当前节点的右子树中
接下来 我们只需要, 将 需要判断的节点 更新为 当前节点的 左孩子结点 或 右孩子结点即可。
直到 遇到一个节点的值 介于我们的两个结点之间, 即它为这两个节点的 最近公共祖先。
这个问题按 对题意解析思路 的不同, 可以有许多的变种问题 和 解决思路
首先我们来看比较简单的一种: 如果这颗树是 二叉搜索树( 假设这个二叉搜索树中没有两个值相同的结点, 并且我们 考虑的这两个结点不是空结点 )
根据二叉搜索树的性质( 左子树的值都比根节点小, 右子树的值都比根节点大 )
我们的思路为: 从根节点开始, 如果两个节点的值 都比当前节点(此时为根节点)小, 则 它们的 最低公共祖先在 当前节点的左子树中, 否则在 当前节点的右子树中
接下来 我们只需要, 将 需要判断的节点 更新为 当前节点的 左孩子结点 或 右孩子结点即可。
直到 遇到一个节点的值 介于我们的两个结点之间, 即它为这两个节点的 最近公共祖先。
当然别忘了 处理 特殊情况: 这两个结点, 其中一个节点 为 另一个结点的 祖先
:
#include <iostream>
#include <windows.h>
using namespace std;
#include "BinarySearchTree.h" //我包含了这个头文件 来测试我们所写的函数是否能达到预期的 效果.
//这个头文件中 只保留了 测试这个函数 需要用到的接口, 如想查看 二叉搜索树 更完整定义, 可以看我的另一篇博客 ---> 二叉搜索树
//因为我们要用到 二叉树结点 来定义 变量, 所以在头文件中, 修改将 结点定义 放在了 类外面。 在 我的 原博客中(即二叉搜索树), 二叉搜索树的结点定义 是属于 类的私有成员.
template &l