二叉树的最低公共祖先 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

二叉树的最低公共祖先(lowest common ancestor), 首先先序遍历找到两个结点的路径, 然后依据链表路径找到最低的公共祖先.

代码:

/*
* main.cpp
*
* Created on: 2014.6.12
* Author: Spike
*/ /*eclipse cdt, gcc 4.8.1*/ #include <iostream>
#include <list>
#include <queue> using namespace std; struct BinaryTreeNode {
BinaryTreeNode(int _value) {
value = _value;
left = NULL;
right = NULL;
} int value;
BinaryTreeNode* left;
BinaryTreeNode* right;
}; void printTree (BinaryTreeNode* tree)
{
BinaryTreeNode* node = tree;
std::queue<BinaryTreeNode*> temp1;
std::queue<BinaryTreeNode*> temp2; temp1.push(node); while (!temp1.empty())
{
node = temp1.front();
if (node->left != NULL) {
temp2.push(node->left);
} if (node->right != NULL) {
temp2.push(node->right);
} temp1.pop(); std::cout << node->value << " "; if (temp1.empty())
{
std::cout << std::endl;
temp1 = temp2;
std::queue<BinaryTreeNode*> empty;
std::swap(temp2, empty);
}
}
} BinaryTreeNode* buildTree (void)
{
BinaryTreeNode* root = new BinaryTreeNode(1);
BinaryTreeNode* node2 = new BinaryTreeNode(2);
BinaryTreeNode* node3 = new BinaryTreeNode(3);
BinaryTreeNode* node4 = new BinaryTreeNode(4);
BinaryTreeNode* node5 = new BinaryTreeNode(5);
BinaryTreeNode* node6 = new BinaryTreeNode(6);
BinaryTreeNode* node7 = new BinaryTreeNode(7);
BinaryTreeNode* node8 = new BinaryTreeNode(8);
BinaryTreeNode* node9 = new BinaryTreeNode(9);
BinaryTreeNode* node10 = new BinaryTreeNode(10); root->left = node2;
root->right = node3; node2->left = node4;
node2->right = node5; node4->left = node6;
node4->right = node7; node5->left = node8;
node5->right = node9; node9->left = node10; return root;
} bool GetNodePath(BinaryTreeNode* root, int v, vector<BinaryTreeNode*>& path) {
if (root->value == v)
return true;
path.push_back(root);
bool found = false;
if (root->left != NULL && !found)
found = GetNodePath(root->left, v, path);
if (root->right != NULL && !found)
found = GetNodePath(root->right, v, path);
if (!found)
path.pop_back();
return found;
} BinaryTreeNode* GetLastCommonNode (
const vector<BinaryTreeNode*>& path1, const vector<BinaryTreeNode*>& path2)
{
vector<BinaryTreeNode*>::const_iterator it1 = path1.begin();
vector<BinaryTreeNode*>::const_iterator it2 = path2.begin();
BinaryTreeNode* pLast = NULL;
while (it1 != path1.end() && it2 != path2.end()) {
if ((*it1)->value == (*it2)->value)
pLast = *it1;
it1++;
it2++;
}
return pLast;
} BinaryTreeNode* GetLastCommonParent(BinaryTreeNode* root, int v1, int v2)
{
if (root == NULL)
return NULL;
vector<BinaryTreeNode*> path1;
GetNodePath(root, v1, path1);
vector<BinaryTreeNode*> path2;
GetNodePath(root, v2, path2); return GetLastCommonNode(path1, path2);
} int main (void)
{
BinaryTreeNode* root = buildTree();
int v1 = 6;
int v2 = 10;
BinaryTreeNode* common = GetLastCommonParent(root, v1, v2);
cout << "common node : " << common->value << endl;
return 0;
}

输出:

common node : 2

编程算法 - 二叉树的最低公共祖先 代码(C)的更多相关文章

  1. 二叉树系列 - 求两节点的最低公共祖先,例 剑指Offer 50

    前言 本篇是对二叉树系列中求最低公共祖先类题目的讨论. 题目 对于给定二叉树,输入两个树节点,求它们的最低公共祖先. 思考:这其实并不单单是一道题目,解题的过程中,要先弄清楚这棵二叉树有没有一些特殊的 ...

  2. 寻找二叉树中的最低公共祖先结点----LCA(Lowest Common Ancestor )问题(递归)

    转自 剑指Offer之 - 树中两个结点的最低公共祖先 题目: 求树中两个节点的最低公共祖先. 思路一: ——如果是二叉树,而且是二叉搜索树,那么是可以找到公共节点的. 二叉搜索树都是排序过的,位于左 ...

  3. 【剑指Offer面试编程题】题目1509:树中两个结点的最低公共祖先--九度OJ

    题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数 ...

  4. 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先

    剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...

  5. 【剑指Offer学习】【面试题50:树中两个结点的最低公共祖先】

    题目:求树中两个结点的最低公共祖先,此树不是二叉树,而且没有指向父节点的指针. 树的结点定义 private static class TreeNode { int val; List<Tree ...

  6. 【Java】 剑指offer(68) 树中两个结点的最低公共祖先

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两个树结点,求它们的最低公共祖先. 思路 该题首先要和面试 ...

  7. (剑指Offer)面试题50:树中两个结点的最低公共祖先

    题目: 求树中两个结点的最低公共祖先 思路: 考虑一下几种情况: 1.该树为二叉搜索树 二叉搜索树是排序树,位于左子树点的结点都比父结点小,而位于右子树的结点都比父结点大,只需要从树的根结点开始和两个 ...

  8. 剑指Offer(第二版)面试案例:树中两个节点的最低公共祖先节点

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/74612786冷血之心的博客) 剑指Offer(第二版)面试案例:树 ...

  9. 【Offer】[68] 【树中两个结点的最低公共祖先】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入两个树结点,求它们的最低公共祖先. [牛客网刷题地址]无 思路分析 该题首先要确定是否为二叉树,还要确定是否为二叉搜索树,是否有父指 ...

随机推荐

  1. ANDROID模拟器访问本地WEB应用10.0.2.2

    在一般的Java Web程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务,但是如果我们在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正 ...

  2. Winform打砖块游戏制作step by step第二节---.画挡板

    一 引子 为了让更多的编程初学者,轻松愉快地掌握面向对象的思考方法,对象继承和多态的妙用,故推出此系列随笔,还望大家多多支持. 预备知识,无GDI画图基础的童鞋请先阅读一篇文章让你彻底弄懂WinFor ...

  3. tiny4412 串口驱动分析三 --- log打印的几个阶段之内核自解压

    作者:彭东林 邮箱:pengdonglin137@163.com 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 ...

  4. 管理 node 版本,选择 nvm 还是 n?

    来源:http://taobaofed.org/blog/2015/11/17/nvm-or-n/ 引子 我本机安装着 nvm,而 node 本来一直运行在 0.x 的老版本上.后来为了跑 ES6,我 ...

  5. httpd配置文件中重写函数Rewrite

    [RewriteCond%{HTTP_HOST}^(www\.)?xxx\.com$] 这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括 ...

  6. QT5.8+vs2015配置以及qt creater中出现中文乱码解决办法之一

    1.参考此文档:QT5.6+vs2015配置: 2.出现乱码问题时候 在头文件上加入: #pragma execution_character_set("utf-8") //加入这 ...

  7. Intellij Idea如何不显示.idea target文件夹

    Intellij Idea如何不显示.idea target文件夹 学习了:https://jingyan.baidu.com/article/ceb9fb108e26958cac2ba047.htm ...

  8. Android之TextView的Span样式源代码剖析

    Android中的TextView是个显示文字的的UI类.在现实中的需求中,文字有各式各样的样式,TextView本身没有属性去设置实现.我们能够通过Android提供的 SpannableStrin ...

  9. .net 真实代理和透明代理的交互

    .本地代理调用 using System; using System.Runtime.Remoting ; using System.Runtime.Remoting.Services ; using ...

  10. Linux终端:speedtest_cli检测你的实时带宽速度

    你在家(或者办公室)的上传和下载速度如何?你能保证,你支付费用给ISP的同时得到了等价的回报? 要想测试我们因特网连接的速度,当下存在着一些因特网服务,比如说SpeedTest,这是一种可以通过Web ...