找出二叉树上任意两个结点的最近共同父结点。
来源:互联网 发布:优站分类目录源码 编辑:程序博客网 时间:2024/06/01 07:52
实际上,用树的后序遍历就可以了。当访问到所求的节点A时,如果这两个节点不在一条线上,则它们必定分别在A的左子树和右子树上,后序遍历到第一个满足这个条件的节点就是所要求的节点A。另外,还必须对这两个节点在一条线上的情况,做特殊处理。
代码:
代码:
static bool lca(Node *root, int va, int vb, Node *&result, Node* parrent)
{
// left/right 左/右子树是否含有要判断的两节点之一
bool left = false, right = false;
if (!result && root->left) left = lca(root->left,va,vb,result,root);
if (!result && root->right) right = lca(root->right,va,vb,result,root);
// mid 当前节点是否是要判断的两节点之一
bool mid = false;
if (root->data == va || root->data == vb) mid=true;
if (!result && int(left + right + mid) == 2) {
if (mid) result = parrent;
else result = root;
}
return left | mid | right ;
}
Node *lca(Node *root,int va, int vb)
{
if (root == NULL) return NULL;
Node *result = NULL;
lca(root, va, vb,result, NULL);
return result;
}
{
// left/right 左/右子树是否含有要判断的两节点之一
bool left = false, right = false;
if (!result && root->left) left = lca(root->left,va,vb,result,root);
if (!result && root->right) right = lca(root->right,va,vb,result,root);
// mid 当前节点是否是要判断的两节点之一
bool mid = false;
if (root->data == va || root->data == vb) mid=true;
if (!result && int(left + right + mid) == 2) {
if (mid) result = parrent;
else result = root;
}
return left | mid | right ;
}
Node *lca(Node *root,int va, int vb)
{
if (root == NULL) return NULL;
Node *result = NULL;
lca(root, va, vb,result, NULL);
return result;
}
作者: flyinghearts
出处: http://www.cnblogs.com/flyinghearts/
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
- 【题目23】找出二叉树上任意两个结点的最近共同父结点
- 微软面试题: 找出二叉树上任意两个结点的最近共同父结点。
- LCA: 找出二叉树上任意两个结点的最近共同父结点
- 找出二叉树上任意两个结点的最近共同父结点。
- 13、设计一个算法,找出二叉树上任意两个结点的最近共同父结点。
- 找出二叉树上任意两个结点的最近共同父结点。
- 微软面试题: 找出二叉树上任意两个结点的最近共同父结点。
- 找出二叉树上任意两个节点的最近共同父节点
- 二叉树两个结点的最低共同父结点
- 二叉树两个结点的最低共同父结点【算法】
- 二叉树两个结点的最低共同父结点
- 二叉树两个结点的最低共同父结点
- 二叉树两个结点的最低共同父结点
- 二叉树两个结点的最低共同父结点
- 二叉树两个结点的最低共同父结点
- 二叉树两个结点的最低共同父结点
- 二叉树两个结点的最低共同父结点
- 75.二叉树两个结点的最低共同父结点
- uCOS-II学习笔记(二)
- 磁盘阵列(Disk Array)原理
- 算法导论-14-2-Josephus排列
- 何时使用服务层
- 硬盘S.M.A.R.T简介
- 找出二叉树上任意两个结点的最近共同父结点。
- 如何在Oracle中实现SELECT TOP N,选取前几条记录
- 朝阳医院项目总结
- gcc链接动态库时,两个动态库中符号重名的问题
- 探索NTFS
- 服务层的优势、劣势
- 设计服务层
- 计算机豆沙绿调法
- IDE硬盘详解