繁体   English   中英

递归遍历二叉树

[英]Traversing a Binary Tree Recursively

在涉及递归函数时,我绝望地迷失了。 我需要创建一个递归函数来遍历二叉树并在特定值之间插入一个新节点。 我需要重新复制我的遍历函数并在我使用它的其他所有函数中修改它吗? 有人请评估遍历功能吗?

我认为我的遍历代码没问题。

Node traverse (Node currentNode){
    if (!currentNode.left.equals(null)){
        traverse (currentNode.left);
        return currentNode.left;
    }
    if (!currentNode.right.equals(null)){
        traverse (currentNode.right);
        return currentNode.right;
    }
    return currentNode;
}

当谈到二叉树时,有几种不同类型的遍历可以递归完成。 它们按照它们被引用然后访问的顺序写入(L =左子,V =访问该节点,R =右子)。

  • 有序遍历(LVR)
  • 反向顺序遍历(RVL)
  • 预订遍历(VLR)
  • 后序遍历(LRV)

你的代码似乎正在执行postorder遍历方法,但是你得到了一些混乱的东西。 首先, 节点是你想要遍历的; 数据是您想要访问的。 其次,您没有理由以实现此方式的方式返回节点本身。 你的代码不允许条件说'我正在寻找这个特定的数据,你有没有Node @ 0xdeadbeef先生?',这可以通过某种额外的搜索参数找到。

学术BST遍历仅打印节点本身。 如果要添加搜索功能,则只需再添加一个参数,以及对正确节点的附加检查。

这是一个片段:

// Academic

public void traverse (Node root){ // Each child of a tree is a root of its subtree.
    if (root.left != null){
        traverse (root.left);
    }
    System.out.println(root.data);
    if (root.right != null){
        traverse (root.right);
    }
}

// Search with a valid node returned, assuming int

public Node traverse (Node root, int data){ // What data are you looking for again?
    if(root.data == data) {
        return root;
    }
    if (root.left != null && data < root.data) {
        return traverse (root.left, data);
    }
    if (root.right != null && data > root.data) {
        return traverse (root.right, data);
    }
    return null;
}

看起来你正在遍历预先订购的方法,但我有点怀疑你究竟想要完成什么,而不是实际比较你当前的节点与定义你到达目的地的一些基础值。 我建议绘制一个简单的树并可视化步骤。 然后尝试将其放入代码中。

递归函数使用修改的参数或终止(退出)条件返回自身的值。 因子,因子:

int factorial( int param ) {
   if ( param > 1 ) {
      return param * factorial( param -1 );
   } else {
      return 1;
   }
}

在你的代码中,你调用'traverse'但是然后对结果不做任何事情......当你的递归函数结束时,如果它存在,你的最终返回将首先留给孩子,否则是第一个正确的孩子,如果它存在,否则根节点。

请详细说明为什么需要遍历树(同样,不确定你的意思是“复制函数并在其他所有函数中修改它”),函数的整个想法是代码一次调用多次)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM