递归遍历二叉树

时间:2012-04-12 03:50:02

标签: java binary-tree

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

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

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;
}

3 个答案:

答案 0 :(得分:14)

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

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

您的代码似乎正在执行后序遍历方法,但您得到了一些混乱的东西。首先,节点是您想要遍历的; 数据是您要访问的内容。其次,您没有理由以实现此方式的方式返回节点本身。你的代码不允许条件说'我正在寻找这个特定数据,你有没有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;
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

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