【问题标题】:Recursing through a AST using DFS使用 DFS 通过 AST 递归
【发布时间】:2019-08-12 15:45:26
【问题描述】:

我正在尝试通过带注释的语法树进行递归。

我的目标是在看到特定类型的节点后增加一个计数器。

Void *DFS(State *N, IrNode *node, int Counter)
{    
    Counter=0

    if (node->irLeftChild == NULL && 
        node->irRightChild == NULL && 
        node->isVisited == false && 
        node->type == kNewtonIrNodeType_Tidentifier)
    {
        Counter+=1
        node->isVisited = true;
        return ;
    }

    DFS(N, node->irLeftChild);

    DFS(N, node->irRightChild); 
}

有没有更好的方法来递归遍历树?

【问题讨论】:

  • 那是因为你没有保留/返回两个递归调用的结果。
  • 您确定要退货吗? - 一个节点有两个孩子的结果应该是什么?
  • 如果您的目标是增加特定类型的所有叶节点,则实际上不应该有返回值。如果您确实只想执行一次并返回一个节点,那么您对 ​​DFS 的调用需要返回一个节点或 null
  • 好的,在这种情况下我将如何集成计数器?我已经修改了上面的代码。这是个好方法吗?
  • 对错误道歉,我现在已经编辑了代码

标签: c algorithm data-structures abstract-syntax-tree


【解决方案1】:

我不确定你想做什么;但是,如果您尝试将符合条件的条目总数返回给调用者,您可能需要类似以下内容:

int DFS(State *N, IrNode *node) {    
    int Counter = 0;

    if (node->irLeftChild == NULL &&  node->irRightChild == NULL &&  node->isVisited == false && node->type == kNewtonIrNodeType_Tidentifier) {
        Counter += 1;
        node->isVisited = true;
    }
    Counter += DFS(N, node->irLeftChild);
    Counter += DFS(N, node->irRightChild); 
    return Counter;
}

【讨论】:

  • 谢谢,但我遇到了无限递归错误。错误:通过这个函数的所有路径都会调用自己[-Werror,-Winfinite-recursion]
  • 我正在尝试通过没有特定结构的 AST 进行递归。但是,我知道我要计算的所有节点都没有子节点并且属于 kNewtonIrNodeType_Tidentifier 类型,但是为了避免再次访问同一个节点,我在 IrNode 中添加了一个 isVisited Struct
  • 啊——你需要在递归到它之前确保一个节点存在;喜欢if(node->irLeftChild != NULL) { Counter += DFS(N, node->irLeftChild); }
猜你喜欢
  • 2015-02-27
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多