在“有序树遍历”中查找特定节点

时间:2014-01-25 16:52:35

标签: c shell tree binary-tree inorder

我正在努力创建自己的shell。

我为用户输入创建了词法分析器和解析器(创建二叉树)。 所以对于这样的命令: cat main.c | ls | WC

我得到了这棵树:

           "|"
           / \
          /   \
         /     \
 "cat main.c"   "|"
                / \
               /   \
             "ls"  "wc"

所以我的树遍历功能(按顺序)是这样的:

inorder(root)
{
   inorder(root->left);
   //exec cmd and do redirection

   inorder(root->right);
}

我的问题是当我在节点“ls”或“wc”时,我不知道如何 检查命令之前和之后是否有管道

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在您的解析树中,管道是节点,命令是叶子。管道必须同时具有左右分支。当您从管道向左移动时,您现在所在的管道就是您要执行的命令的输出管道。当你向右走的时候,你所在的管道就是目的地命令的管道。

因此将入口和出口管道作为参数传递。如果该命令或其中一个NULL节点没有重定向,则它们指向|

inorder(root, in, out)
{
    if (root is cmd) {
        execute(root, in, out);
    } else {
        // root is pipe
        inorder(root->left, in, root);
        redirect(in, out);
        inorder(root->right, root, out);
    }
}

使用inorder(root, NULL, NULL)从树的根开始。