当前位置: 首页 > 知识库问答 >
问题:

基于递归的二叉树根节点距离

殳毅
2023-03-14

我读了一个算法来寻找二叉树中两个节点之间的距离。
这段代码在二叉树中找到(从根到给定节点的1个距离)。

 int Pathlength(Node* root, int n1) {
        if (root != NULL) {
            int x=0;
            if ((root->data == n1) || (x=Pathlength(root->left, n1))>0||(x=Pathlength(root->right, n1))>0) 
            {

                return x + 1;
            }
            return 0;
        }
     return 0;
    }

我不明白的是,“x”有两个值,一个来自左子树,另一个来自右子树,它如何知道返回哪个值
例如,如果树类似于:

20  
/  \  
8  2

然后调用路径长度(根,8)

x=Pathlength(root->left,8)=1  
x=Pathlength(root->right,2)=0  

那么,在语句“returnx1”中,它如何返回正确的x值?

共有1个答案

姬乐
2023-03-14

你需要明白在C/C中,逻辑OR||是短路的:

在计算A | | B时,如果A为真,则不计算B(因为无论B是什么,A | | B始终为真)。

在此表达式中:

(root->data == n1) || (x=Pathlength(root->left, n1))>0||(x=Pathlength(root->right, n1))>0

路径长度(根)-

 类似资料:
  • 问题内容: 我想在非二叉树中搜索一个项目(任何节点都可以有n个孩子)并立即退出递归。所讨论的节点可以是任何节点,而不仅仅是叶子。 这是我的代码,但我没有完整的搜索。 nNode包含: (是孩子) 和数据对象。 问题答案: 探索第一个孩子后,您不应该退出。您不需要循环前面的语句。

  • 好的,我必须创建一个递归方法来计算树中的节点,我做到了(变量名是葡萄牙语的,对不起): arvbin是二叉树,esq和dir是对树分支的左右引用。 我以为这会奏效,但由于某种原因,当我尝试运行它时,它返回0。我使用了一些调试,我认为问题在于,当方法完成并返回到原始的非递归方法时,cardinalidade变量被设置为0。我不确定这是否是因为自动装箱会弄乱我的整数并将其转换为int,然后当我调用该方

  • 我需要创建一个递归方法,将二叉查找树的根节点作为参数。这个递归方法将返回整个二叉查找树中内部节点总数的int值。 这就是我到目前为止所拥有的: 有没有更好的办法?我还坚持寻找迭代解。

  • 我坚持使用递归函数来查找二叉树中节点的深度,更具体地说,是在else条件中: 如果树是二叉搜索树,知道左子值总是低于父值,右子值总是高于父值,我可以添加一个If条件,这样如果节点x值低于根,我总是返回根- 当查看函数时,假设节点总是存在的,节点x永远不是根,并且在开始时传递的深度总是0。 如果树是二叉搜索:

  • 我试图通过自顶向下递归实现二叉树最低公共祖先(LCA)问题的解决方案。 我使用的方法是: 想法:找到在任一子树中有一个所需节点的节点,而另一个所需节点是相反的子树。 以下是确切的实现: 例如: 这将返回树的根作为结果。结果=TreeNode(2)

  • 我正在写二叉树的删除函数。我把我的案子分为三个。一个同时具有两个子项null。一个有一个子项为null,另一个有两个子项都不为null。我在案例3之后递归调用delete操作。对于ex,如您所见,我在节点50上调用了删除操作。这将用75替换父节点50。现在我必须从右子树中删除节点75。所以我递归地运行了delete过程。但我没有得到所需的输出,因为75是50的右子树中的根节点。如何修复它以便能够删