Lowest Common Ancestor of a Binary Search Tree
2016-05-28 10:02
295 查看
情况一:节点只有左、右指针,root已知
思路:一开始想到用递归去做,但是因为本来对递归的概念还很模糊,所以在设计递归出口的时候一点思路也没有,翻了关于递归的资料,找到一张图能很好地解释递归:
递归有两个出口,一是没有找到a或者b,则返回NULL;二是只要碰到a或者b,就立刻返回,这样的话下面的代码就很好理解了。
[cpp] view
plain copy
// 二叉树结点的描述
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild; // 左右孩子
}BinaryTreeNode;
// 节点只有左指针、右指针,没有parent指针,root已知
BinaryTreeNode* findLowestCommonAncestor(BinaryTreeNode* root , BinaryTreeNode* a , BinaryTreeNode* b)
{
if(root == NULL)
return NULL;
if(root == a || root == b)
return root;
BinaryTreeNode* left = findLowestCommonAncestor(root->lchild , a , b);
BinaryTreeNode* right = findLowestCommonAncestor(root->rchild , a , b);
if(left && right)
return root;
return left ? left : right;
}
情况二: 二叉树是个二叉查找树,且root和两个节点的值(a, b)已知
[cpp] view
plain copy
// 二叉树是个二叉查找树,且root和两个节点的值(a, b)已知
BinaryTreeNode* findLowestCommonAncestor(BinaryTreeNode* root , BinaryTreeNode* a , BinaryTreeNode* b)
{
char min , max;
if(a->data < b->data)
min = a->data , max = b->data;
else
min = b->data , max = a->data;
while(root)
{
if(root->data >= min && root->data <= max)
return root;
else if(root->data < min && root->data < max)
root = root->rchild;
else
root = root->lchild;
}
return NULL;
}
思路:一开始想到用递归去做,但是因为本来对递归的概念还很模糊,所以在设计递归出口的时候一点思路也没有,翻了关于递归的资料,找到一张图能很好地解释递归:
递归有两个出口,一是没有找到a或者b,则返回NULL;二是只要碰到a或者b,就立刻返回,这样的话下面的代码就很好理解了。
[cpp] view
plain copy
// 二叉树结点的描述
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild; // 左右孩子
}BinaryTreeNode;
// 节点只有左指针、右指针,没有parent指针,root已知
BinaryTreeNode* findLowestCommonAncestor(BinaryTreeNode* root , BinaryTreeNode* a , BinaryTreeNode* b)
{
if(root == NULL)
return NULL;
if(root == a || root == b)
return root;
BinaryTreeNode* left = findLowestCommonAncestor(root->lchild , a , b);
BinaryTreeNode* right = findLowestCommonAncestor(root->rchild , a , b);
if(left && right)
return root;
return left ? left : right;
}
情况二: 二叉树是个二叉查找树,且root和两个节点的值(a, b)已知
[cpp] view
plain copy
// 二叉树是个二叉查找树,且root和两个节点的值(a, b)已知
BinaryTreeNode* findLowestCommonAncestor(BinaryTreeNode* root , BinaryTreeNode* a , BinaryTreeNode* b)
{
char min , max;
if(a->data < b->data)
min = a->data , max = b->data;
else
min = b->data , max = a->data;
while(root)
{
if(root->data >= min && root->data <= max)
return root;
else if(root->data < min && root->data < max)
root = root->rchild;
else
root = root->lchild;
}
return NULL;
}
相关文章推荐
- java教程:Java编程风格与命名规范整理
- ActionBar
- UIView
- 如何对齐多个对象
- 【HDU】 1211 RSA
- 项目36-数组类运算的实现
- form控件中添加js代码,用javascript:某代码段(注意javascript之后用双引号)
- poj 2823 Sliding Window
- NYOJ Rectangles--1255第七届
- linux内核打补丁步骤
- 管理修改
- Bootmem机制
- 认识Node.js中流
- Qt学习之路(17): Qt标准对话框之QMessageBox
- 深入理解RunLoop
- VS2012通过ASO.NET实体模型添加oracle数据库连接
- 联系方式
- 多线程下载器(不含数据库部分)
- xml解析
- 同步合成PPT幻灯片与讲演视频