语言-试编写算法,求二叉树T中结点a和b的最近共同祖先。

问题描述

试编写算法,求二叉树T中结点a和b的最近共同祖先。
试编写算法,求二叉树T中结点a和b的最近共同祖先。
二叉链表类型定义:
typedef struct BiTNode {
TElemType data;
struct BiTNode lchild*rchild;
} BiTNode *BiTree;
可用栈类型Stack的相关定义:
typedef struct {
BiTNode *ptr; // 二叉树结点的指针类型
int tag; // 0..1
} SElemType; // 栈的元素类型
Status InitStack(Stack &S);
Status StackEmpty(Stack S);
int StackLength(SqStack S);
Status Push(Stack &S SElemType e);
Status Pop(Stack &S SElemType &e);
Status GetTop(Stack S SElemType &e);
*
********/
BiTree CommAncestor(BiTree T TElemType a TElemType b)
/* 求二叉树T中结点a和b的最近共同祖先 */
{

}

解决方案

http://blog.csdn.net/xzz_hust/article/details/8847427

解决方案二:

 BTreeNode_t *GetLastCommonParent( BTreeNode_t *pRoot BTreeNode_t *pNode1 BTreeNode_t *pNode2){    if( pRoot == NULL ) //说明是空树,不用查找了,也就找不到对应节点,则返回NULL        return  NULL;    if( pRoot == pNode1 || pRoot == pNode2 )//说明在当前子树的根节点上找到两个节点之一        return pRoot;    BTreeNode_t   *pLeft = GetLastCommonParent( pRoot->m_pLeft pNode1 pNode2);  //左子树中的查找两个节点并返回查找结果    BTreeNode_t   *pRight = GetLastCommonParent( pRoot->m_pRight pNode1 pNode2);//右子树中查找两个节点并返回查找结果    if( pLeft == NULL )//如果在左子树中没有找到,则断定两个节点都在右子树中,可以返回右子树中查询结果;否则,需要结合左右子树查询结果共同断定        return pRight;    if ( pRight == NULL )//如果在右子树中没有找到,则断定两个节点都在左子树中,可以返回左子树中查询结果;否则,需要结合左右子树查询结果共同断定        return pLeft;    return pRoot;//如果在左右子树中都找两个节点之一,则pRoot就是最低公共祖先节点,返回即可。}

解决方案三:
非递归方式:

 BTreeNode_t *GetLastCommonParent(BTreeNode_t *pRoot  BTreeNode_t *pNode1 BTreeNode_t *pNode2){    if( pRoot == NULL || pNode1 == NULL || pNode2 == NULL)         return NULL;    vector < BTreeNode_t *>  vec1;//用来保存从根节点到指定节点的遍历路径,前序遍历    vector <BTreeNode_t *>   vec2;    stack <BTreeNode_t *>   st;    bool  findflag1 = false;    bool findflag2 = false;    BTreeNode_t *commonParent = NULL;    while( pRoot != NULL || !st.empty() ){        while( pRoot != NULL ){            if( findflag1 == false){//没有找出所有的节点:从根节点到指定节点,在遍历时继续入栈                vec1.push_back( pRoot);                if( pRoot == pNode1)//找到,则设置标志位                    findflag1 = true;            }            if( findflag2 == false ){                vec1.push_back( pRoot);                if( pRoot == pNode2 )                    findflag2 = true;            }            if( findflag1 == true && findflag2 == true)//如果都已找到,则退出                break;            st.push( pRoot);            pRoot = pRoot->m_pLeft;        }        while( !st.empty()){            pRoot = st.top();            st.pop();            pRoot = pRoot->right;            if( findflag1 == false )//没有找到全部路径节点时,就需要将错误路径节点退出                vec1.pop_back();            if( findflag2 == false )                vec2.pop_back();        }        if( findflag1 == true && findflag2 == true)//如果都已找到,则退出            break;    }     if( findflag1 == true && findflag2 == true){//在两个遍历路径上查找最后一个相同的节点,就是最低公共祖先节点(最近公共父节点)         vector< BTreeNode_t *> ::iterator iter1 = vec1.begin();         vector< BTreeNode_t *> ::iterator iter2 = vec2.begin();         while( iter1 != vec1.end() && iter2 != vec2.end() ){             if( *iter1 == *iter2)                 commonParent = *iter1;             else                 break;             ++iter1;             ++iter2;         }     }     vec1.clear();     vec2.clear();     st.clear();     return commonParent;}

解决方案四:
http://zhidao.baidu.com/link?url=XWB_Ohn5Rdem5d9LMzIBMEDJ12q6synTnkzam1RD63BeBVyWKZVZZgwrLNa6xyl-y5oBNSM2eQ89qhl0IS_GaOY0Elp9Vtm2ZWRGRWY6wAi

解决方案五:
http://gouwu.baidu.com/question/328583857270789805.html?entry=qb_browse_default

时间: 2024-09-17 04:24:38

语言-试编写算法,求二叉树T中结点a和b的最近共同祖先。的相关文章

跪求大神-数据结构c语言版 编写:判定二叉树是完全二叉树。

问题描述 数据结构c语言版 编写:判定二叉树是完全二叉树. 求大神,感激不尽 2015-12-22下午2点之前希望有大神解答. 解决方案 无非就是递归遍历,判断参考:http://www.cnblogs.com/buptLizer/archive/2012/03/30/2425097.html 解决方案二: 数据结构(C语言版)摘录--树和二叉树数据结构 二叉树的实现 c语言版C语言数据结构-二叉树

谢谢-数据结构c语言版 编写:判定二叉树是完全二叉树。

问题描述 数据结构c语言版 编写:判定二叉树是完全二叉树. 求大神,感激不尽 2015-12-22下午2点之前希望有大神解答. 解决方案 无非就是递归遍历,判断参考:http://www.cnblogs.com/buptLizer/archive/2012/03/30/2425097.html 解决方案二: 数据结构(C语言版)摘录--树和二叉树数据结构 二叉树的实现 c语言版C语言数据结构-二叉树

游戏编程-如何设计一个算法求coinfilp游戏中的最佳步骤呢?

问题描述 如何设计一个算法求coinfilp游戏中的最佳步骤呢? 就是那个cocos2dx示例中的翻硬币游戏.规则如下: 1.有NxM的格子,N和M都是可变的,每个格子有一个硬币,有正反两面. 2.当点击某一个硬币时,该硬币和其相邻的四个硬币(如果存在)一起翻面.当场上所有硬币都处于正面时,游戏完成. 因为我不知道这个游戏如何玩,因此想写一个算法,自动求出任意状态下到达游戏完成的最佳步骤.但现在毫无头绪..求大神帮助

C语言及程序设计进阶例程-18 链表中结点的插入和删除

贺老师教学链接  C语言及程序设计进阶 本课讲解 回顾:动态分配和撤销内存 #include <stdio.h> #include <malloc.h> struct Student { int num; float score; struct Student *next; }; int main( ) { struct Student *p; p=malloc(sizeof(struct Student)); p->num=31001; p->score=89.5;

【算法导论】求二叉树的叶子数和深度

二叉树的叶子数和深度 二叉树的遍历算法是许多二叉树运算的算法设计的基础,因此遍历算法的应用很广泛.下面以遍历算法求二叉树的叶子数和深度为例,来加深对于二叉树遍历算法的理解.1. 统计二叉树中的叶子结点数因为叶子结点是二叉树中那些左孩子和右孩子均不存在的结点,所以可在二叉树的遍历过程中,对这种特殊结点进行计数,来完成对叶子结点数的统计.这个统计可在任何一种遍历方式下给出,下面是利用中序遍历来实现的算法: /**********************************************

求解答-试编写一个算法,找出一个循环链表中的最小值。我是新手,编了一个程序,不知错在哪

问题描述 试编写一个算法,找出一个循环链表中的最小值.我是新手,编了一个程序,不知错在哪 #includeusing namespace std; class LinkNode{ int data; LinkNode *link; LinkNode(int d=0LinkNode *l=0){data=d;link=l;}}; class List{private: LinkNode *first; int n;public: List() { first=new LinkNode; first

c语言-基于C语言,用蚁群算法求最优路径。百度复制粘贴的别来了。。。要求可以直接运行的代码哈

问题描述 基于C语言,用蚁群算法求最优路径.百度复制粘贴的别来了...要求可以直接运行的代码哈 一个人从上海大学出发,经过若干个地点,路线不重复走,最后回到上海大学,找三条优化路线. 上海大学:北纬N31°19′5.86″ 东经E121°23′21.52″ 星雨城:北纬N31°19′46.58″ 东经E121°24′9.29″ 大康公寓:北纬N31°19′18.88″ 东经E121°25′3.98″ 文景楼:北纬N22°35′23.78″ 东经E113°52′50.67″ 大场中学:北纬N31°

C++用Dijkstra(迪杰斯特拉)算法求最短路径_C 语言

算法介绍 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低. 算法思想 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的集合(初始时只含有源点V0) (2)V-S=T:尚未确定的顶点集合 将T中顶点按递增

在长度大于1的单循环链表中既无头结点也无头指针s为指向某个结点的指针编写算法删除结点*s的前驱结点

问题描述 在长度大于1的单循环链表中既无头结点也无头指针s为指向某个结点的指针编写算法删除结点*s的前驱结点 如链表中为(12345),用户输入1,则结果应为(1,234).这种情况实现不了,求大神解答 #includeusing namespace std;typedef struct LNode{ int data; struct LNode *next; }LNode*LinkList;void begin(LinkList &l){ l=new LNode; l->next=NULL