二叉树两结点的最低共同父结点
2012-08-20 20:44
267 查看
题目:二叉树的结点定义如下:
struct TreeNode
{
int m_nvalue;
TreeNode* m_pLeft;
TreeNode* m_pRight;
};
输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。
分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。
第一变种是二叉树是一种特殊的二叉树:查找二叉树。也就是树是排序过的,位于左子树上的结点都比父结点小,而位于右子树的结点都比父结点大。我们只需要从根结点开始和两个结点进行比较。如果当前结点的值比两个结点都大,则最低的共同父结点一定在当前结点的左子树中。如果当前结点的值比两个结点都小,则最低的共同父结点一定在当前结点的右子树中。
第二个变种是树不一定是二叉树,每个结点都有一个指针指向它的父结点。于是我们可以从任何一个结点出发,得到一个到达树根结点的单向链表。因此这个问题转换为两个单向链表的第一个公共结点。我们在本面试题系列的第35题讨论了这个问题。
第一变种:二叉排序树,代码如下
struct TreeNode
{
int m_nvalue;
TreeNode* m_pLeft;
TreeNode* m_pRight;
};
输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。
分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。
第一变种是二叉树是一种特殊的二叉树:查找二叉树。也就是树是排序过的,位于左子树上的结点都比父结点小,而位于右子树的结点都比父结点大。我们只需要从根结点开始和两个结点进行比较。如果当前结点的值比两个结点都大,则最低的共同父结点一定在当前结点的左子树中。如果当前结点的值比两个结点都小,则最低的共同父结点一定在当前结点的右子树中。
第二个变种是树不一定是二叉树,每个结点都有一个指针指向它的父结点。于是我们可以从任何一个结点出发,得到一个到达树根结点的单向链表。因此这个问题转换为两个单向链表的第一个公共结点。我们在本面试题系列的第35题讨论了这个问题。
第一变种:二叉排序树,代码如下
#include "stdafx.h" #include<iostream> using namespace std; typedef struct node{ int data; struct node *left; struct node *right; }Node,*Bitree; void insert(Bitree &T,int ch)//建立二叉排序树 { if(T == NULL) { Bitree t = (Bitree)malloc(sizeof(Node)); t->data = ch; t->left = NULL; t->right = NULL; T = t; }else if(ch > T->data) { insert(T->right,ch); }else if(ch < T->data) { insert(T->left,ch); }else{ cout<<"duplicate value in ordered tree"<<endl; } } void travel(Bitree T) { if(T != NULL) { travel(T->left); cout<<T->data<<" ";//中序遍历 travel(T->right); } } bool find(Bitree T,int ch)//输入数值是否存在 { if(T == NULL) return false; if(T->data == ch) { return true; }else if(T->data > ch) { return find(T->left,ch); }else if(T->data < ch) { return find(T->right,ch); } } Bitree findParent(Bitree T,Bitree one, Bitree two)//查找共同父节点 { if(T == NULL) { return NULL; } if((T->data > one->data) && (T->data > two->data))//如果2个查询节点的data都小于根节点,那么他们的共同父节点都在根节点的左子树上 { return findParent(T->left,one, two); }else if((T->data < one->data) && (T->data < two->data))//如果2个查询节点的data都小于根节点,那么他们的共同父节点都在根节点的右子树上 { return findParent(T->right,one,two); } else if((T->data < one->data) && (T->data > two->data))//如果2个节点的值分别大于,小于根节点的值,那么如果2个节点都存在的话,根节点,就是他们的最早共同付节点 { if(find(T->left,two->data)&&find(T->right,one->data))//确定2个节点都存在在这棵树上 return T; else return NULL; }else if((T->data > one->data) && (T->data < two->data))//同上 { if(find(T->right,two->data)&&find(T->left,one->data)) return T; else return NULL; } return NULL; } int main() { Bitree root = NULL; int ch; cin>>ch; while(ch != 0)//创建树 { insert(root,ch); cin>>ch; } travel(root); cout<<endl; while(true)//输入2个节点,输出最早共同父节点 { Bitree one =(Bitree)malloc(sizeof(Node)); Bitree two =(Bitree)malloc(sizeof(Node)); cout<<"input the first value:"; cin>>one->data; cout<<"input the second vlaue:"; cin>>two->data; Bitree p = findParent(root,one,two); if(p ==NULL) cout<<"no parent"<<endl; else cout<<p->data<<endl; } getchar(); getchar(); return 0; }
相关文章推荐
- 二叉树两结点的最低共同父结点
- 二叉树两个结点的最低共同父结点
- 二叉树两个结点的最低共同父结点
- 二叉树两结点的最低共同父结点[数据结构]
- 48. 二叉树两结点的最低共同父结点(3种变种情况)[Get lowest common ancestor of binary tree]
- 75 二叉树两个结点的最低共同父结点
- 二叉树两个结点的最低共同父结点【算法】
- 二叉树两个结点的最低共同父结点
- 二叉树两个结点的最低共同父结点
- 二叉树两个结点的最低共同父结点
- 二叉树两结点的最低共同父结点
- 学习笔记——二叉树两结点的最低共同父结点
- 程序员面试题精选100题(48)-二叉树两个结点的最低共同父结点
- 二叉树两个结点的最低共同父结点
- 程序员面试100题之五:二叉树两个结点的最低共同父结点
- [面试] 二叉树两结点的最低共同父结点
- 程序员面试题精选100题(48)-二叉树两个结点的最低共同父结点
- 二叉树两个结点的最低共同父结点
- 二叉树两结点的最低共同父结点
- 程序员面试100题之五:二叉树两个结点的最低共同父结点