- 浏览: 21828 次
- 性别:
- 来自: 南京
最新评论
题目:要求寻找二叉树中两个节点的最近的公共祖先,并将其返回。
view sourceprint?1 class Node
2 {
3 Node * left;
4 Node * right;
5 Node * parent;
6 };
7 /*查找p,q的最近公共祖先并将其返回。*/
8 Node * NearestCommonAncestor(Node * p,Node * q);
算法思想:这道题的关键在于每个节点中包含指向父节点的指针,这使得程序可以用一个简单的算法实现。首先给出p的父节点p->parent,然后将q的所有父节点依次和p->parent作比较,如果发现两个节点相等,则该节点就是最近公共祖先,直接将其返回。如果没找到相等节点,则将q的所有父节点依次和p->parent->parent作比较......直到p->parent==root。
程序代码:
view sourceprint?01 Node * NearestCommonAncestor(Node * root,Node * p,Node * q)
02 {
03 Node * temp;
04 while(p!=NULL)
05 {
06 p=p->parent;
07 temp=q;
08 while(temp!=NULL)
09 {
10 if(p==temp->parent)
11 return p;
12 temp=temp->parent;
13 }
14 }
15 }
题目:将一个单链表逆转——原来的头指针变为尾指针,原来的尾指针变为头指针。
算法思想:从链表的头结点开始依次逆转,最终将整个链表逆转。
程序代码:
view sourceprint?01 /*节点的类定义*/
02 class Node
03 {
04 Node * next;
05 };
06
07 /*链表的类定义*/
08 class List
09 {
10 Node * head;
11 };
12
13 /*逆转函数——将一个单链表逆转*/
14 void ReverseList(List & list)
15 {
16 Node * pre=NULL;
17 Node * cur=list.head;
18 Node * back=cur->next;
19
20 while(back!=NULL)
21 {
22 cur->next=pre;
23 pre=cur;
24 cur=back;
25 back=cur->next;
26 }
27
28 }
知识拓展:对于第二个二叉树的问题,如果节点中不包含指向父节点的指针应该怎么计算?
算法思想:如果一个节点的左子树包含p,q中的一个节点,右子树包含另一个,则这个节点就是p,q的最近公共祖先。
程序代码:
view sourceprint?01 /*查找a,b的最近公共祖先,root为根节点,out为最近公共祖先的指针地址*/
02 int FindNCA(Node* root, Node* a, Node* b, Node** out)
03 {
04 if( root == null )
05 {
06 return 0;
07 }
08
09 if( root == a || root == b )
10 {
11 return 1;
12 }
13
14 int iLeft = FindNCA(root->left, a, b, out);
15 if( iLeft == 2 )
16 {
17 return 2;
18 }
19
20 int iRight = FindNCA(root->right, a, b, out);
21 if( iRight == 2 )
22 {
23 return 2;
24 }
25
26 if( iLeft + iRight == 2 )
27 {
28 *out == root;
29 }
30 return iLeft + iRight;
31 }
32
33 void main()
34 {
35 Node* root = ...;
36 Node* a = ...;
37 Node* b = ...;
38 Node* out = null;
39 int i = FindNCA(root, a, b, &out);
40 if( i == 2 )
41 {
42 printf("Result pointer is %p", out);
43 }
44 else
45 {
46 printf("Not find pointer");
47 }
48 }
view sourceprint?1 class Node
2 {
3 Node * left;
4 Node * right;
5 Node * parent;
6 };
7 /*查找p,q的最近公共祖先并将其返回。*/
8 Node * NearestCommonAncestor(Node * p,Node * q);
算法思想:这道题的关键在于每个节点中包含指向父节点的指针,这使得程序可以用一个简单的算法实现。首先给出p的父节点p->parent,然后将q的所有父节点依次和p->parent作比较,如果发现两个节点相等,则该节点就是最近公共祖先,直接将其返回。如果没找到相等节点,则将q的所有父节点依次和p->parent->parent作比较......直到p->parent==root。
程序代码:
view sourceprint?01 Node * NearestCommonAncestor(Node * root,Node * p,Node * q)
02 {
03 Node * temp;
04 while(p!=NULL)
05 {
06 p=p->parent;
07 temp=q;
08 while(temp!=NULL)
09 {
10 if(p==temp->parent)
11 return p;
12 temp=temp->parent;
13 }
14 }
15 }
题目:将一个单链表逆转——原来的头指针变为尾指针,原来的尾指针变为头指针。
算法思想:从链表的头结点开始依次逆转,最终将整个链表逆转。
程序代码:
view sourceprint?01 /*节点的类定义*/
02 class Node
03 {
04 Node * next;
05 };
06
07 /*链表的类定义*/
08 class List
09 {
10 Node * head;
11 };
12
13 /*逆转函数——将一个单链表逆转*/
14 void ReverseList(List & list)
15 {
16 Node * pre=NULL;
17 Node * cur=list.head;
18 Node * back=cur->next;
19
20 while(back!=NULL)
21 {
22 cur->next=pre;
23 pre=cur;
24 cur=back;
25 back=cur->next;
26 }
27
28 }
知识拓展:对于第二个二叉树的问题,如果节点中不包含指向父节点的指针应该怎么计算?
算法思想:如果一个节点的左子树包含p,q中的一个节点,右子树包含另一个,则这个节点就是p,q的最近公共祖先。
程序代码:
view sourceprint?01 /*查找a,b的最近公共祖先,root为根节点,out为最近公共祖先的指针地址*/
02 int FindNCA(Node* root, Node* a, Node* b, Node** out)
03 {
04 if( root == null )
05 {
06 return 0;
07 }
08
09 if( root == a || root == b )
10 {
11 return 1;
12 }
13
14 int iLeft = FindNCA(root->left, a, b, out);
15 if( iLeft == 2 )
16 {
17 return 2;
18 }
19
20 int iRight = FindNCA(root->right, a, b, out);
21 if( iRight == 2 )
22 {
23 return 2;
24 }
25
26 if( iLeft + iRight == 2 )
27 {
28 *out == root;
29 }
30 return iLeft + iRight;
31 }
32
33 void main()
34 {
35 Node* root = ...;
36 Node* a = ...;
37 Node* b = ...;
38 Node* out = null;
39 int i = FindNCA(root, a, b, &out);
40 if( i == 2 )
41 {
42 printf("Result pointer is %p", out);
43 }
44 else
45 {
46 printf("Not find pointer");
47 }
48 }
发表评论
-
KMP快速字符串查找算法
2011-08-25 19:29 667在C/C++语言编程过程中,一般的字符串搜索操作都是通过标准库 ... -
求解最大公约数问题
2011-08-25 19:27 693最大公因数,又称最大公约数。是指 [n(≧2)个自然数 a1, ... -
堆排序(Heap Sort)算法学习
2011-08-25 19:26 1084在程序设计相关领域, ... -
整数拆分问题的动态规划解法
2011-08-25 19:26 3069输入n,和k,问将n用1到k这k个数字进行拆分,有多少种拆分方 ... -
背包问题介绍与分析
2011-08-25 19:24 1030背包问题是在1978年由Merkel和Hellman提出的。它 ... -
求平方根sqrt()函数的底层算法效率问题
2011-08-25 19:23 1291我们平时经常会有一些数据运算的操作,需要调用sqrt,exp, ... -
面试中常见的一些算法问题
2011-08-25 19:22 697Problem 1 : Is it a loop ? ( ... -
各种排序算法的C++实现与性能比较
2011-08-25 19:21 918排序是计算机算法中非常重要的一项,而排序算法又有不少实现方法, ... -
背包问题之硬币找零问题
2011-08-25 19:19 1173设有6 种不同面值的硬 ... -
求能被1到20的数整除的最小正整数
2011-08-25 19:18 1369求能被1到20的数整除的最小正整数。最直觉的方法是求1到20这 ... -
买书折扣最优惠问题解法
2011-08-25 19:17 752题目:在节假日的时候 ... -
判断一个整数是否是2的N次方
2011-08-25 19:04 1822题目:给定一个整数num,判断这个整数是否是2的N次方。比如, ... -
字符串逆序的算法汇总
2011-08-25 19:01 1057很早就准备写一个字符串系列的面试题,本来已经写好了,大概有十几 ... -
计算从1到N中1的出现次数
2011-08-25 18:59 597给定一个十进制整数N, ... -
KMP快速字符串查找算法
2011-08-25 18:57 965在C/C++语言编程过程中,一般的字符串搜索操作都是通过标准库 ... -
快速排序的递归实现
2011-08-25 18:54 756快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将 ... -
数字1亿里面有多少个1呢
2011-08-25 18:52 739乍看这题真够唬人的,群里看到这个题目后争先恐后的说看法。最简单 ... -
最大子序列、最长公共子串、最长公共子序列
2011-08-25 18:33 791最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续 ... -
一道关于男女比例的面试题
2011-08-25 16:56 1037阿里巴巴的一道面试题:说澳大利亚的父母喜欢女孩,如果生出来的第 ...
相关推荐
在二叉树中,最近公共祖先(最近共同祖先,LCA,Lowest Common Ancestor)是指两个节点在树中的最近的共同父节点。在某些应用场景,如文件系统或社交网络中,找到最近公共祖先具有重要意义。 针对给定的"二叉树最近...
最低公共祖先问题是指给定两个节点,找到它们在二叉树中的最近公共祖先。这个公共祖先应当满足两个条件:一是它是两个给定节点的祖先,二是没有其他节点比它更接近这两个节点。这个问题在实际应用中很有价值,比如在...
在计算机科学领域,二叉树的最近公共祖先(Lowest Common Ancestor,简称LCA)问题是一个经典的数据结构问题,特别是在图论和算法设计中。最近公共祖先指的是在一棵树中,两个节点的共同祖先中离叶子节点最远的一个...
C语言所写源代码有注释,哈工大数据结构实验课自己所作,仅供参考
本资料包“python入门-leetcode面试题解之第236题二叉树的最近公共祖先.zip”正专注于这个方向,旨在帮助初学者解决LeetCode中的面试难题。 LeetCode是一个知名的在线平台,提供各种算法问题供用户练习和提高,它...
二叉树的最近公共祖先问题是一个经典的算法问题,主要涉及数据结构中的树和递归算法。给定一个二叉树和两个节点p和q,任务是找到这两个节点在树中的最近公共祖先。最近公共祖先(LCA)是指满足以下条件的节点x:x是p...
在给定的问题中,我们被要求找到一个二叉树中两个特定节点的最近公共祖先(Lowest Common Ancestor,简称LCA)。这个问题是基于二叉树数据结构的一个经典问题,通常出现在算法面试或编程竞赛中,例如LeetCode的题目...
剑指 Offer 68 - II. 二叉树的最近公共祖先原题链接:剑指 Offer 68 - II. 二叉树的最近公共祖先代码public TreeNode l
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)” 例如,给定如下二叉树: root = [3...
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节
中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以
在遍历过程中,我们记录每个节点的祖先节点,并计算两个节点的最近公共祖先。 算法优化 为了提高算法的效率,我们可以对算法进行优化。例如,我们可以使用哈希表来存储每个节点的祖先节点,以便快速查找两个节点的...
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节
在利用栈建立一个二叉树的基础上,我们可以通过递归来实现二叉树中两个结点的最近公共祖先结点。递归是一种非常强大的算法技巧,它可以通过反复调用自身来解决问题。在这个特定的问题中,我们可以利用递归来查找两个...
在二叉树中,最低公共祖先(Lowest Common Ancestor, LCA)是指在树中同时是两个给定节点的最近的共同祖先。本篇主要介绍如何使用C语言求解二叉树节点的最低公共祖先,并结合ACM的练习题目进行深入解析。 首先,...
求最近公共祖先的问题通常在二叉树中提出,目标是找到两个给定节点在树中最近的共同祖先。这个祖先应该满足两个条件:一是它是两个给定节点的祖先,二是所有满足这两个条件的节点中,它的深度是最小的。 解决这个...
【最近公共祖先(LCA)问题详解】 最近公共祖先(Lowest Common Ancestor,简称LCA)是指在一颗树中,两个指定节点的最近的共同祖先。这个问题在计算机科学,尤其是数据结构和算法领域中非常常见,特别是在处理...
最近公共祖先问题在二叉树中经常出现,尤其是在数据结构和算法面试中,因为它涉及到对树的遍历和理解。 第235题的题目大致是这样的:给定一个BST的根节点和两个不同的节点值,目标是找到这两个节点在树中的最近公共...
# Python实现《剑指offer》 部分代码自己添加了一些测试用例, 或者自己添加了一些功能 ...6. 所需的素质:扎实的基础知识、能写高质量的代码、分析问题是思路清晰、能优化时间和空间效率、学习沟通能力