问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

二叉树指定两个结点共同的祖先

发布网友 发布时间:2022-05-29 06:18

我来回答

1个回答

热心网友 时间:2023-10-09 09:05

已知二叉收索树上两个结点的值,请找出它们的最低公共祖先。你可以假设这两个值肯定存在。
int FindLowestCommonAncestor(node *root, int value1, int value2)
{
int larger, smaller;
larger = (value1 > value2)? value1:value2;
smaller = (value1 > value2)? value2:value1;
node *curNode = root;
node *curFather = root;

while(curNode){
if(curNode->data == larger || curNode->data == smaller)
return curFather->data;
else if(curNode->data > larger){
curFather = curNode;
curNode = curNode->left;
}
else if(curNode->data < smaller){
curFather = curNode;
curNode = curNode->right;
}
else return curNode->data;
}
}//
/
/
/
/
/
/
C语言实现:

/*二叉排序树的生成及树,任意两结点的最低公共祖先 Amirural设计*/
#include <stdio.h>
#define null 0

int counter=0;
typedef struct btreenode
{int data;
struct btreenode *lchild;
struct btreenode *rchild;
}bnode;

bnode *creat(int x,bnode *lbt,bnode *rbt) //生成一棵以x为结点,以lbt和rbt为左右子树的二叉树
{bnode *p;
p=(bnode*)malloc(sizeof(bnode));
p->data=x;
p->lchild=lbt;
p->rchild=rbt;
return(p);
}

bnode *ins_lchild(bnode *p, int x) //x作为左孩子插到二叉树中
{bnode *q;
if(p==null)
printf("Illegal insert.");
else
{q=(bnode*)malloc(sizeof(bnode));
q->data=x;
q->lchild=null;
q->rchild=null;
if(p->lchild!=null) //若p有左孩子,则将原来的左孩子作为结点x的右孩子
q->rchild=p->lchild;
p->lchild=q;
}
return(p);
}

bnode *ins_rchild(bnode *p, int x) //x作为右孩子插入到二叉树
{bnode *q;
if(p==null)
printf("Illegal insert.");
else
{q=(bnode*)malloc(sizeof(bnode));
q->data=x;
q->lchild=null;
q->rchild=null;
if(p->rchild!=null) //若x有右孩子,则将原来的右孩子作为结点x的的左孩子
q->lchild=p->rchild;
p->rchild=q;
}
return(p);
}

void prorder(bnode *p)
{if(p==null)
return;
printf("%d\t%u\t%d\t%u\t%u\n",++counter,p,p->data,p->lchild,p->rchild);
if(p->lchild!=null)
prorder(p->lchild);
if(p->rchild!=null)
prorder(p->rchild);
}

void print(bnode *p) //嵌套括号表示二叉树,输出左子树前打印左括号,
{ //输出右子树后打印右括号。
if(p!=null)
{printf("%d",p->data);
if(p->lchild!=null||p->rchild!=null)
{printf("(");
print(p->lchild);
if(p->rchild!=null)
printf(",");
print(p->rchild);
printf(")");
}
}
}

int FindLowestCommonAncestor(bnode *root, int value1, int value2)
{
bnode *curnode = root;
while(1)
{
if (curnode->data>value1&&curnode->data>value2)
curnode = curnode->lchild;
else if(curnode->data<value1&&curnode->data<value2)
curnode = curnode->rchild;
else
return curnode->data;
}
}

main()
{
bnode *bt,*p,*q;
int x,y,v1,v2;
printf("输入根结点:");
scanf("%d",&x);
p=creat(x,null,null);
bt=p; //使bt p都指向根结点
printf("输入新的结点值:");
scanf("%d",&x);
while(x!=-1)
{p=bt;
q=p;
while(x!=p->data&&q!=null) //q记录当前根结点
{p=q;
if(x<p->data)
q=p->lchild;
else
q=p->rchild;
}
if(x==p->data)
{printf("元素%d已经插入二叉树中!\n",x);
}
else
if(x<p->data) ins_lchild(p,x);
else ins_rchild(p,x);
scanf("%d",&x);
}
p=bt;
printf("struct of the binary tree:\n");
printf("number\taddress\tdata\tlchild\trchild\n");
prorder(p);
printf("\n");
printf("用括号形式输出二叉树:");
print(p);

printf("\n请任意输入树中存在的两个结点:");
scanf("%d,%d",&v1,&v2);
y = FindLowestCommonAncestor(p, v1, v2);
printf("输出%d和%d的最低公共祖先:",v1,v2);
printf("%d\n",y);
}

运行结果:
输入根结点:20
输入新的结点值:8 22 4 12 10 14 -1 (以-1结束结点的输入)
struct of the binary tree:
number addresss data lchild rchild
1 4391168 20 4391104 4391040
2 4391104 8 4390976 4399072
3 4390976 4 0 0
4 4399072 12 4399008 4398944
5 4399008 10 0 0
6 4398644 14 0 0
7 4391040 22 0 0
用括号形式输出:20(8(4,12(10,14)),22) (输出左子树打印左括号,输出右子树后打印括号)
请任意输入树中存在的两个结点:4,14
输出4和14的最低祖先:8
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 苏州有哪些体检的医院,体检项目有哪些?价格怎样啊?求解答。。。 求二叉树中指定两个结点的共同祖先 苏州附一院的普通体检有哪些项目?(健康体检) 二叉搜索树中的最近公共祖先,求各位大神帮忙呀 苏州市立医院东区体检中心全身体检有多少项目要花多少钱啊? 如何求一个二叉排序树两个节点的公共祖先 苏州三院【市立医院北区】普通入职体检要测哪些项目啊? 苏州第一人民医院入职体检肝功能包含? 学计算机网络管理员需要多长时间 crm客户关系管理系统哪家好 苏州相城人民医院入职体检多少钱!? 苏州相城区人民医院体检项目具体有哪些? CRM管理系统软件多少钱? 哪家公司的性价比高? 网络组建与管理一般要学多久 谁告诉我苏州附二医院入职体检有那几项啊? 哪位亲知道 苏州大学附属第二医院的入职体检都项目有哪些? 求《芙蓉镇》百度云高清资源在线观看,刘晓庆主演的 苏州大学附属第一医院的入职体检项目有哪些啊?亲谁知道,会查肝炎不?谢谢了,大神帮忙啊 管理123的哪一款crm软件最便宜? 苏州大学附属第一医院的入职体检项目有哪些 苏州九龙医院驾照体检,需要什么注意事项么?如:空腹?中午不能体检?流程? 二叉树按顺序方式存储在数组A[1....N]中,设计算法求出下标分别为I和J的两个节点的最近的 公共祖先节点的值 用唯物辩证法的矛盾观的知识说明应如何促进产业数字化转型? hop的过去式? 如何推进数字化产业服务项目,如何做? 数据结构根结点有父结点,祖先结点吗? 数字化产业应该如何推进? Hip-hop is in a state of 9-1-1什么意思? 守护甜心主题曲中的第一句“Hop! Step! Jump! Draw ! Draw! Drawn!是什么意思? 建筑行业数字化转型的关键是什么?如何实现? 守护甜心里面的守护甜心变身后叫什么名字 自己有车可以放到租车公司出租吗 把自己车子放到租车行? 把车放在大方租车平台安全吗? 把车放到联联租车平台,有什么保障没 歌曲推荐给不会唱歌的人 不会唱歌的人,一开始唱什么歌比较合适? dnf年套都送什么东西 每样都说出来谢谢! 一场露天文艺晚会的预算 如何成功的举办一次文艺晚会(要求1000字以上)