6_33_两个一维数组判断u是否为v的子孙

#include<stdio.h>
int L[6+1]={0,2,4,0,6,0,0};
int R[6+1]={0,3,5,0,0,0,6};
int n=6;
int IfSon(int u,int v)
{
   if(u&&v){
        if(L[v]==u||R[v]==u)
            return 1;
        else
            return(IfSon(u,L[v])||IfSon(u,R[v]));
   }
   return 0;
}
int main()
{
    printf("%d\n",IfSon(5,1));
}

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

转载于:https://www.cnblogs.com/Thereisnospon/p/4768479.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 算法如下: 1. 如果u和v相等,则u是v的子孙,返回true。 2. 如果v为空,则u不可能是v的子孙,返回false。 3. 递归判断u是否是v的左孩子的子孙,如果是,返回true。 4. 递归判断u是否是v的右孩子的子孙,如果是,返回true。 5. 如果u既不是v的左孩子的子孙,也不是v的右孩子的子孙,则u不可能是v的子孙,返回false。 代码如下: bool isDescendant(int u, int v, int l[], int r[]) { if (u == v) { return true; } if (v == ) { return false; } if (isDescendant(u, l[v], l, r)) { return true; } if (isDescendant(u, r[v], l, r)) { return true; } return false; } ### 回答2: 假设我们需要判断的节点为u,目标节点为v。首先,我们需要找到v这个节点在二叉树中的位置,可以通过遍历二叉树的方式找到v的位置。在找到v节点的位置后,可以从该节点开始遍历以找到u这个节点。具体来说,可以按照以下步骤进行: 1. 定义一个递归函数,该函数用于搜索子树并查找节点u,函数接收当前节点的编号和要查找的节点u的编号作为参数。 2. 如果当前节点编号为0,即空节点,则说明查找失败,返回false。 3. 如果当前节点编号为u,则说明找到了节点u,返回true。 4. 如果当前节点编号不为u,则继续递归搜索左子树和右子树。具体来说,首先在左子树上递归搜索,传入参数为左子树的根节点编号和要查找的节点u的编号。如果左子树的搜索结果为true,则说明在左子树中找到了节点u,可以直接返回true。如果左子树的搜索结果为false,则说明左子树中没有节点u,需要继续在右子树上递归搜索。在右子树上递归搜索时,传入参数为右子树的根节点编号和要查找的节点u的编号。如果右子树的搜索结果为true,则说明在右子树中找到了节点u,可以直接返回true。如果右子树的搜索结果为false,则说明节点u不存在于以当前节点为根的子树中,可以直接返回false。 5. 在主程序中,调用递归函数,从目标节点v开始递归搜索。 6. 如果搜索结果为true,则说明节点u是节点v的后代,返回true。如果搜索结果为false,则说明节点u不是节点v的后代,返回false。 算法的时间复杂度是O(n),其中n为树中节点的个数。由于算法使用了递归函数,因此可能会存在最大递归深度的限制。在实际使用中,可以通过递归转非递归的方式来解决这个问题。 ### 回答3: 题目描述 假定两个一维数组l[n 1]和r[n 1]作为有n个结点的二叉树的存储结构,l[i]和r[i]分别指示结点i(i=1,2,...,n)的左孩子和右孩子,0表示空。现在要写一个算法,判断结点u是否是结点v的子节点。 算法思路 为了判断结点u是否是结点v的子节点,我们需要从结点v开始递归地遍历整棵树。 首先,如果结点v为空,则返回false,因为没有子节点和空节点匹配。 然后,如果结点v的值和结点u的值相同,则返回true,因为结点u是结点v的直接子节点。 如果结点v不是结点u的父节点,则将其左右子节点作为参数递归调用该函数,检查左右子树是否可以找到结点u。 如果左右子树中的一个或两个都找到了结点u,则返回true,否则返回false。 算法实现 下面是用Python实现的算法: ```python def is_descendant(l, r, v, u): # 判断结点v是否为空,如果为空,则返回false if v == 0: return False # 如果结点v的值和结点u的值相同,则返回true if v == u: return True # 递归地检查结点v的左右子树 return is_descendant(l, r, l[v], u) or is_descendant(l, r, r[v], u) ``` 算法分析 该算法的最坏时间复杂度为O(n),其中n是二叉树的节点数。这是因为在最坏情况下,我们需要遍历整棵树才能找到结点u,这需要访问所有节点。在最好情况下,时间复杂度为O(1),因为结点u可能就是结点v的一个子节点,此时不存在递归调用的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值