首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

二叉树结点最近的共同祖先结点

二叉树结点最近的共同祖先结点 题目要求及思路分析 题目要求:已知在二叉树中,* root 为根结点,* p和* q为二叉树中两个结点,试编写距离它们最近的共同祖先的算法。...算法实现 1.两种数据类型的结构体定义 /*-------二叉树的二叉链结点结构定义------*/ #define TElemType char typedef struct BiTNode{...return e; } //pop /*-----栈的基本操作函数结束-----*/ 3.用到的树的基本操作函数 *------树的基本操作的函数------*/ //按照二叉树的定义初始化一个空树...bt)return OVERFLOW; *bt = NULL; return OK; } //构造二叉链表表示的二叉树T //按先序次序输入二叉树结点的值(一个字符),空格字符表示空树.../*距两个子结点最近的共同祖先结点*/ Status FindPath(BiTree root, BiTree target, SqStack *path){ SqStack* s;

1.4K21
您找到你想要的搜索结果了吗?
是的
没有找到

完全二叉树结点个数

给出一个完全二叉树,求出该树的节点个数。...输入: 1 / \ 2 3 / \ / 4 5 6 输出: 6 解决方案 对于该问题的第一反应是直接dfs统计时间复杂度为O(N),其中N为结点数目。...但是没有使用到完全二叉树的特性。 由于该树为完全二叉树,可以先计算得到其层数记做level(从0开始),其第0层到level - 1层中元素的数目为2 ^ level - 1个。...第level层最少有一个结点,最多有2^level个结点,因此结点数目为[2 ^ level, 2 ^ (level + 1) - 1],此时就可二分结果了。...对于给定cur判断其是否存在,只需依次从高到低位遍历cur的二进制位,若为0则为当前结点的左子树,为1则为当前结点的右子树,最终即可找到当前cur所对应的那个结点,判断其是否存在即可。

39210

第 K 个数的问题

给一堆乱序的数,如果它们从小到大排好,第 k 个是多少。假设排列的下标从 1 开始,而非 0 开始。 这个问题如此之简单而熟悉,可它却可以是很多现实问题的某一个子问题的抽象。...如果这堆数不是放在一起,而是在若干个数组里呢? 前面说了,如果这堆数只在一个数组里,有两种办法可以排序,如果是在若干个不同的数组里呢?一样可以从快排和堆排序两个思路去分析。...具体来说,如果拿到若干个数组,从中任意取两个数 x 和 y,要求 x+y 的各种组合里面的第 k 个,或者在全为非负数的情况下引入乘法,比如 x*y+2x 的所有组合里面的第 k 个。...sum<k,说明这个数在每台机器上 machine[i] 往后,直到结尾的这一段数中; 如果 sum>k,说明这个数在每台机器上 machine[i] 往前,直到开头的这一段数中。...这个方法改变了思考的角度,原本是从一堆数中去找第 k 个数,现在是从中拿出一个数来,去这堆数中找它应该在的位置。 还蛮有趣的。

36620

树的叶子结点与完全二叉树结点计算方法

一:完全二叉树结点问题 分析: 设叶子节点个数为n0,度为1的节点个数为n1,度为2的节点个数为n2 侧有 n0+n1+n2=n...下面看另一个题目: 一颗完全二叉树第六层有8个叶结点(根为第一层),则结点个数最多有()个。...已知在一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶子结点个数为?...解决这道题的思路是列出一个关于各个度的结点的等式,从而根据已知条件算出度为0的结点个数,下面具体说一下解题方法: 设树T中的结点个数为n,度为0的结点个数为n0,度为1的结点个数为n1,度为2的结点个数为...n2,度为3的结点个数为n3,度为4的结点个数为n4,则有: n = n0 + n1 + n2 + n3 + n4 设树T中的总边数为e,因为除了根节点的入度为0,其余各节点的入度都为1,则有: e

5.2K20

二叉树的公共父结点

1 / \ 2 3 / \ / \ 4 5 6 7 /\ /\ /\ /\ 如上图所示,由正整数 1, 2, 3, ...组成了一棵无限大的二叉树...从某一个结点到根结点(编号是1的结点)都有一条唯一的路径,比如从5到根结点的路径是(5, 2, 1),从4到根结点的路径是(4, 2, 1),从根结点1到根结点的路径上只包含一个结点1,因此路径就是(1...对于两个结点x和y,假设他们到根结点的路径分别是(x1, x2, ... ,1)和(y1, y2,...,1),那么必然存在两个正整数i和j,使得从xi 和yj 开始,有xi = yj,xi + 1 =...输入样例: 10 4 输出样例: 2 解题思路: 设子节点序号为x,因为题目给的这棵无限大的二叉树是一棵完全二叉树,所以其父节点序号为int(x/2)。...x=x/2 : y=y/2; } //当x和y相等时,说明找到了它们的首个公共父结点 cout << x << endl; } return

52320

个数组的最大k个数(java)

问题描述:个数组的最大k个数,如,{1,5,8,9,11,2,3}的最大三个数应该是,8,9,11 问题分析:     1.解法一:最直观的做法是将数组从大到小排序,然后选出其中最大的K个数,但是这样的解法...但是这都是会对前K个数进行排序,所以效率不高,当K很大的时候,以上两种方法效率都不是很高。    ...2.解法二:不对前K个数进行排序,回忆快排的算法中,那个partition函数,就是随机选择数组中的一个数,把比这个数大的数,放在数组的前面,把比这个数小的数放在数组的 后面,这时想如果找出的随机数,最终位置就是...K,那么最大的K个数就找出来了,沿着这个思路思考问题,但是这个函数,最后的索引位置并不一定是K,可能比K大也可能比K小,我们把找出的数组分成两部分sa,sb,sa是大的部分,sb是小的部分,如果sa的长度等于

80020
领券