首页
学习
活动
专区
工具
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.5K21
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    完全二叉树结点个数

    给出一个完全二叉树,求出该树的节点个数。...输入: 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所对应的那个结点,判断其是否存在即可。

    41610

    【经验分享】数据结构——树的叶子结点个数计算方法

    一道题就可以学会 在一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶结点个数是() A、41 B、82 C、122 D、其他 这种题做法固定...,记住两个公式即可 度 4 3 2 1 0 结点个数 20 10 1 10 x(叶子结点) ①n = 20 + 10 + 1 + 10 + x ②n-1 = 20*4 + 10*3 + 1*2 + 10...*1 + x*0 联立①、②得: x(叶子结点)=82 解惑: 1、为什么n=20+10+1+10+x?...答:结点总数=所有结点数的和 2、为什么是n-1=20*4+10*3+1*2+10*1+x*0? 答:对于任意树,如果树中有 n 个节点,则树中有 n−1 条边。...边数=节点数−1 边数=该结点*该结点的度+该结点*该结点的度+...+该结点*该结点的度 注:参照上面的表和式子理解这个公式,很好理解的。

    11010

    【数据结构】C语言实现二叉树的基本操作——二叉树的层次遍历、深度、结点数……

    在今天的内容中我们将会继续介绍二叉树的一些基本操作如二叉树的层次遍历、二叉树的深度、二叉树结点总数、二叉树第K层的结点数、二叉树的叶结点数……以及如何通过C语言来实现这些基本操作。...,因此对结点操作时满足先入先出的操作特性,所以我们在实现层序遍历时借助了队列; 在二叉树中,二叉树的遍历是二叉树的其它操作的基础,不管是二叉树的深度、二叉树的总结点数、二叉树第K层的结点数、二叉树的叶结点数.../将根结点入队 int level = 1;//记录二叉树的层序 int level_num = 1;//记录当前层次的结点个数 int nextlevel_num = 0;//记录下一层的结点个数...三、 二叉树结点数 在二叉树中我们可能会遇到一棵二叉树的总结点数、对高为h的二叉树第K层的结点数、二叉树的叶结点数……一系列的结点数的问题,下面我们就来分别介绍一下如何二叉树的总结点数,第...3.1 二叉树结点总数 对于二叉树而言,如果我们要求树中总的结点个数,我们能够想到的方式就是将每一层的结点数都求出来然后相加,那如何每一层的结点数呢?

    12610

    第 K 个数的问题

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

    39620

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

    一:完全二叉树结点问题 分析: 设叶子节点个数为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

    7.7K20

    二叉树的公共父结点

    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

    53820
    领券