您的位置:首页 > 其它

二叉树两结点的最低共同父结点

2012-08-20 20:44 267 查看
题目:二叉树的结点定义如下:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: