编程算法 - 二叉树的最低公共祖先 代码(C)
二叉树的最低公共祖先 代码(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)的更多相关文章
- 二叉树系列 - 求两节点的最低公共祖先,例 剑指Offer 50
前言 本篇是对二叉树系列中求最低公共祖先类题目的讨论. 题目 对于给定二叉树,输入两个树节点,求它们的最低公共祖先. 思考:这其实并不单单是一道题目,解题的过程中,要先弄清楚这棵二叉树有没有一些特殊的 ...
- 寻找二叉树中的最低公共祖先结点----LCA(Lowest Common Ancestor )问题(递归)
转自 剑指Offer之 - 树中两个结点的最低公共祖先 题目: 求树中两个节点的最低公共祖先. 思路一: ——如果是二叉树,而且是二叉搜索树,那么是可以找到公共节点的. 二叉搜索树都是排序过的,位于左 ...
- 【剑指Offer面试编程题】题目1509:树中两个结点的最低公共祖先--九度OJ
题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数 ...
- 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先
剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...
- 【剑指Offer学习】【面试题50:树中两个结点的最低公共祖先】
题目:求树中两个结点的最低公共祖先,此树不是二叉树,而且没有指向父节点的指针. 树的结点定义 private static class TreeNode { int val; List<Tree ...
- 【Java】 剑指offer(68) 树中两个结点的最低公共祖先
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入两个树结点,求它们的最低公共祖先. 思路 该题首先要和面试 ...
- (剑指Offer)面试题50:树中两个结点的最低公共祖先
题目: 求树中两个结点的最低公共祖先 思路: 考虑一下几种情况: 1.该树为二叉搜索树 二叉搜索树是排序树,位于左子树点的结点都比父结点小,而位于右子树的结点都比父结点大,只需要从树的根结点开始和两个 ...
- 剑指Offer(第二版)面试案例:树中两个节点的最低公共祖先节点
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/74612786冷血之心的博客) 剑指Offer(第二版)面试案例:树 ...
- 【Offer】[68] 【树中两个结点的最低公共祖先】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入两个树结点,求它们的最低公共祖先. [牛客网刷题地址]无 思路分析 该题首先要确定是否为二叉树,还要确定是否为二叉搜索树,是否有父指 ...
随机推荐
- LNMP第一部分环境搭建
1. MySQL安装(同LAMP里面的安装方法)2. php安装wget http://cn2.php.net/distributions/php-5.4.37.tar.bz2tar jxf ph ...
- Git历险记(一)
[编者按]作为分布式版本控制系统的重要代表——Git已经为越来越多的人所认识,它相对于我们熟悉的CVS.SVN甚至同时分布式控制系统的 Mercurial,有哪些优势和不足呢.这次InfoQ中文站有幸 ...
- 【Hadoop】Hadoop MR 自定义序列化类
1.基本概念 2.Mapper代码 package com.ares.hadoop.mr.flowsum; import java.io.IOException; import org.apache. ...
- 转:提高ios通过率的注意点
http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=431 Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内 ...
- Elasticsearch教程(七) elasticsearch Insert 插入数据(Java)
首先我不赞成再采用一些中间件(jar包)来解决和 Elasticsearch 之间的交互,比如 Spring-data-elasticsearch.jar 系列一样,用就得依赖它.而 Elastic ...
- 系统重装 VISTA下如何删除EISA分区
现在的品牌电脑大部分都有一键还原,把还原内容存储在EISA配置的隐藏分区里面,一般的软件都无法对其进行操作,保证分区及系统还原的安全性.这样的功能对于一些人不使用一键还原(笔者即是)来说实属鸡肋功 ...
- Win7安装了Visual Studio 2008没有快捷方式怎么办
在C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE,就是这个devenv.exe了
- Laravel之视图和Blade模板引擎
一.视图 1.视图文件存放在resources/views目录2.视图载入及传参 return view('greeting', ['name' => 'James']); 还可以通过with ...
- php中const和static的区别和联系
1.const是类中的常量,类外用define来定义常量2.const只可以修饰类的属性,不能修饰类的方法,static可以修饰属性,也可以修饰方法3.const和static都属于类本身,而不属于n ...
- NYOJ-277-车牌号
车牌号 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描写叙述 茵茵非常喜欢研究车牌号码,从车牌号码上能够看出号码注冊的早晚,据研究发现,车牌号码是按字典序发放的,如今她收集 ...