【问题标题】:Traversing a tree, but each node visited should visit every node underneath遍历一棵树,但访问的每个节点都应该访问下面的每个节点
【发布时间】:2014-11-16 19:56:31
【问题描述】:

我正在遍历一棵树,这很容易,而且我知道该怎么做。但是,我想在每次迭代时访问当前节点下的每个节点。我不确定我是否清楚,所以我将尝试说明这一点:

        A
      /   \
     B     C
    / \   / \
   D   E F   G

第一次迭代:节点是 A:访问 B、C、D、E、F、G 第二次迭代:节点为 B:访问 D、E 第二次迭代:节点为D:访问F、G

我试着把它写成一个普通的遍历:

    public static void addCodes(Message root)
    {
         if (root.getLeftChild() != null){
               root.getLeftChild().setCode(root.getLeftChild().getCode() + "0");
               addCodes(root.getLeftChild());
         }
         if (root.getRightChild() != null) {
               root.getRightChild().setCode(root.getRightChild().getCode() + "1");
               addCodes(root.getRightChild());

         }
    }

但这显然行不通。每个节点被访问一次。我明白为什么,我只是不知道如何解决它。如果这是迭代的,它将是嵌套循环。这个的递归等价物是什么?

【问题讨论】:

  • 访问顺序重要吗? 'B,D,E,C,F,G' 的顺序也可以吗?
  • 不,我只是根据它是在右子树还是左子树中添加代码,顺序无关紧要。

标签: java algorithm recursion


【解决方案1】:

我想通了。

public static void addCodes(Message root)
{
     if (root.getLeftChild() != null){
           root.getLeftChild().setCode(root.getLeftChild().getCode() + "0");
           addCodes(root.getLeftChild());
     }
     if (root.getRightChild() != null) {
           root.getRightChild().setCode(root.getRightChild().getCode() + "1");
           addCodes(root.getRightChild());

     }
}

public static void addCode(Message root)
{
     if (root.getLeftChild() != null){
           addCodes(root.getLeftChild());
           addCode(root.getLeftChild());
     }
     if (root.getRightChild() != null) {
           addCodes(root.getRightChild());
           addCode(root.getRightChild());
     }
}

Main 调用 addCode。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多