设计一个算法求节点值为x和节点y值得两个节点的最近共同祖先

原创 2015年07月06日 23:55:59

思想:采用非递归后序遍历二叉树b.当找到节点值为x的节点时将栈中所有节点值存放在anorx数组中(如图所示的二叉树,F节点的anorx为“ACF”),当找到节点值为y的节点时将栈中所有节点值存放在anory数组中(对于如图所示的二叉树,E节点的anory为“ACE”),当两个节点均已找到后,通过比较找到他们最近的公共祖先(对于如图所示的二叉树,F和E节点的最近公共祖先为C),对应的算法如下:












int commancestor(BTNode *b,ElementType x,ElementType y)

{

ElementType anorx[MaxSize],anory[MaxSize];

BTNode *St[MaxSize];//定义一个顺序栈

BTNode *p=b,*q;

int flag,top=-1,i;//栈指针置初值

bool findx=false,findy=false;

if(b!=NULL)

{

do

{

while(p!=NULL)//将*p所有左节点进栈

{

top++;

St[top]=p;

p=p->lchild;

}

q=NULL;//q指向栈顶节点的前一个已访问的节点

flag=1;//设置flag=1表示处理栈顶节点

while(top!=-1&&flag==1)

{

p=St[top];//取当前的栈顶元素

if(p->rchild==q)//右孩子不存在或右孩子已被访问,访问之
{

if(p->data==x)//要访问的节点为要找的节点

{

for(i=0;i<top;i++)//将路径存入anorx中

{

anorx[i]=St[i]->data;

}

findx=true;

}

else if(p->data==y)//将路径存入anory中

{

for(i=0;i<=top;i++)

{

anory[i]=St[i]->data;

}

findy=true;

}

if(findx&&findy)//x和y均已找到

{

i=0;

while(anorx[i]==anory[i])

i++;

printf("最近公共祖先:%c\n",anorx[i-1]);

return 1;

}

top--;

q=p;//q指向刚被访问的节点

}

else

{

p=p->rchild;//p指向右孩子节点

flag=0;//设置flag=0表示栈顶节点处理完毕

}

}

}while(top!=-1);//栈不空循环

printf("\n");

}

return 0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

求二叉树中任意两结点的最近共同祖先的算法及其证明

一、问题描述   已知一个二叉树T,以及该二叉树中的某两个结点A和B。求:结点A和B的最近共同祖先。 二、算法描述 先序遍历二叉树T,得到其先序序列Seqpre。不失一般性地,设: S...
  • xuzhezhaozhao
  • xuzhezhaozhao
  • 2013年04月24日 23:36
  • 2829

在二叉树中找到两个节点的最近公共祖先

程序员代码面试指南(左程云)读书笔记 第三章 在二叉树中找到两个节点的最近公共祖先 题目:       给定一棵二叉树的头节点head,以及这棵二叉树的两个节点o1和o2,请返回o1和o2的...
  • qq_33323162
  • qq_33323162
  • 2016年08月30日 17:21
  • 2043

求二叉树的任意两个节点的最近公共祖先

 二叉查找树   如果该二叉树是二叉查找树,那么求解LCA十分简单。 基本思想为:从树根开始,该节点的值为t,如果t大于t1和t2,说明t1和t2都位于t的左侧,所以它们的共同祖先必定在...
  • Manketon
  • Manketon
  • 2014年09月24日 15:55
  • 1110

求一颗不含指向父节点指针的普通树中任意两个结点的最近公共祖先(O(N*N) 和 O(N) 算法)

//方法1 来自剑指offer //#include //#include //#include //using namespace std; //#include "BinaryTree.h"...
  • ssopp24
  • ssopp24
  • 2017年06月29日 15:51
  • 650

查找二叉树某两个节点最近的共同祖先及改进方法

这个题目偶尔看到网上有个jie
  • J__King
  • J__King
  • 2014年09月09日 23:12
  • 1768

求二叉树中两个节点的最近公共祖先结点

二叉树是搜索二叉树 1、原理:二叉搜索树是排序过的 ,位于左子树的结点都比父结点小,位于右子树的结点都比父结点大,我们只需从根节点开始和两个输入的结点进行比较,如果当前节点的值比两个结点的值都大,那么...
  • xiaocherry1128
  • xiaocherry1128
  • 2017年07月29日 16:26
  • 1422

判断一棵树是否是完全二叉树和求二叉树中两个节点的最近公共祖先——题集(十三)

判断一棵树是否是完全二叉树和求二叉树中两个节点的最近公共祖先——题集(十三) 今天来分享一下,如何判断一棵树是否是完全二叉树和求二叉树中两个节点的最近公共祖先的代码实现和运行示例。 判断一棵树是否是完...
  • sd_bit19
  • sd_bit19
  • 2017年07月28日 23:29
  • 204

LCA问题:求二叉树中任意两个节点的最近公共祖先

问题描述:英语:Given an arbitrary binary tree, propose amethod to determine the first common ancestor of 2 ...
  • tianliang0123
  • tianliang0123
  • 2012年01月03日 10:44
  • 4690

看数据结构写代码(26) 求二叉链表 任意 两个节点的 最近祖先

杂谈:在网上 看到 这个 题目,忍不住  自己 操作了 一把。 呵呵。兴趣 是 最好的 老师。 网上的 解决方案 五花八门,其中 比较 好 理解的 思路 就是 求出 两个节点 的 所有祖先。然后 比...
  • fuming0210sc
  • fuming0210sc
  • 2015年03月25日 12:20
  • 538

【面试题】剑指Offer-50-求两个节点的最近公共祖先

题目概述 一颗二叉树,给出两个节点,求这两个节点的公共的祖先节点(要求的是离他们是最近的) 比如,6和8的公共节点为1,4,但是最近公共节点为4 解题思路 假设我们求6和8两个节点的公...
  • qq_31828515
  • qq_31828515
  • 2017年04月22日 15:56
  • 576
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计一个算法求节点值为x和节点y值得两个节点的最近共同祖先
举报原因:
原因补充:

(最多只允许输入30个字)