C++ 表达式树printLevel()函数

C++ 表达式树printLevel()函数,c++,binary-search-tree,C++,Binary Search Tree,我正在实现一个二叉表达式树。叶节点是数字,非叶节点是数学运算符。成功实现了printInorder、PostOrder、PreOrder和evaluate。但是被printLevel()卡住了 这是我的int main() intmain() { 树; 弦乐测试[]={“2.1*3.1+4.2”,“2.0+1.3)/1.4”,“2.*(1.3+1.4)”,“1.2*(1.3+1.4/0.5)”,“1.2*(1.3+1.4/0.5)-4.4”,“1.2*(1.3+1.4/0.5)-(9/3)”;

我正在实现一个二叉表达式树。叶节点是数字,非叶节点是数学运算符。成功实现了printInorder、PostOrder、PreOrder和evaluate。但是被printLevel()卡住了

这是我的int main()

intmain()
{
树;
弦乐测试[]={“2.1*3.1+4.2”,“2.0+1.3)/1.4”,“2.*(1.3+1.4)”,“1.2*(1.3+1.4/0.5)”,“1.2*(1.3+1.4/0.5)-4.4”,“1.2*(1.3+1.4/0.5)-(9/3)”;
对于(int i=0;i<6;i++)
{
myTree.build(tests[i]);
myTree.printInorder();
myTree.printproorder();
myTree.printPostorder();
myTree.printLevel();//从level=0开始
不正确);
}

cout当使用广度优先搜索打印彼此相邻的一个级别上的节点时,您只需观察当前级别上最左侧节点的最左侧子节点何时从队列中弹出:这一定是下一个级别的开始。我可以轻松编写代码,但我猜这对您和这个家庭来说是不可理解的工作是为你准备的(顺便说一句,我认为你想把你的文章恰当地标记为家庭作业)。你的大部分实现看起来像是一个直接的实现。唯一缺少的是检测到下一个级别已达到。

因为你对递归没有问题,这将在没有
队列的情况下工作:

void EXTree:: printLevel()
{
    int currentLevel = 0;
    if (root)
    {
        cout << "Current Level is: ";
        printLevelHelper(root,currentLevel);
    }
    else
        cout << "This BST is Empty\n";
}

// Declare a private method:
void EXTree:: printLevelHelper(Node* &n, int &currentLevel)
{
    cout << currentLevel << ' ';
    if (n->Left)
    {
        currentLevel++;
        printLevelHelper(n->Left,currentLevel);
        currentLevel--;
    }
    if (n->Right)
    {
        currentLevel++;
        printLevelHelper(n->Right,currentLevel);
        currentLevel--;
    }
}
void EXTree::printLevel()
{
int currentLevel=0;
如果(根)
{
cout-Right,current-level);
当前级别--;
}
}

非常感谢。(仍在尝试获取该函数的逻辑:))这是我现在的输出;顺序遍历是:3.1+4.2前顺序遍历是:+3.1 4.2后顺序遍历是:3.1 4.2+当前级别是:0当前级别是:1当前级别是:1 Evagulating myTree=7.3所有节点都已成功删除…另一个更改,请立即尝试,我在第二个(如果)我还编写了
printLevelHelper(n->Left,currentLevel);
而它应该是(像现在一样)
printLevelHelper(n->Right,currentLevel)
非常有魅力!非常感谢。顺便说一句,我还创建了另一个应该也可以使用的代码。这是我的代码。我还有一个问题,那就是,我不能在字符串中插入超过2个数字。例如=字符串测试[]={(2.0+1.3+3.0)/1.4“}//而且它不算3.0以前试过,它是有效的:)但是当一个妄想症中有2个以上的数字时,它怎么会不识别这个数字呢?当出现逻辑错误时,这很难发现。(再次感谢您的时间。)欢迎,还没有读过您的代码,只是快速回顾一下,我想问题是当解析器输入
,他准备推送2个节点:在
(2.0+1.3+3.0)
中,他找到2.0并为其创建一个节点,在1.3中也是如此,然后直接寻找
。而在
(2.0+(1.3+3.0))
中,他找到2.0为其创建一个节点,为第二个元素找到另一个
因此创建一个新节点,并通过递归调用再次进入相同的过程(准备推送两个子节点),然后查找
第二个调用,然后第一个调用结束。
void EXTree:: printLevel()
{
    queue<Node*> levelq;

    levelq.push(root);
    cout << "Current Level is: ";
    while( levelq.size() > 0 )
    {
        Node *cur = levelq.front();
        cout << cur->Root << "  ";
        levelq.pop();
        if (cur->Left)  levelq.push(cur->Left);
        if (cur->Right) levelq.push(cur->Right);
    }
    cout << endl;
}
void EXTree:: printLevel()
{
    int currentLevel = 0;
    if (root)
    {
        cout << "Current Level is: ";
        printLevelHelper(root,currentLevel);
    }
    else
        cout << "This BST is Empty\n";
}

// Declare a private method:
void EXTree:: printLevelHelper(Node* &n, int &currentLevel)
{
    cout << currentLevel << ' ';
    if (n->Left)
    {
        currentLevel++;
        printLevelHelper(n->Left,currentLevel);
        currentLevel--;
    }
    if (n->Right)
    {
        currentLevel++;
        printLevelHelper(n->Right,currentLevel);
        currentLevel--;
    }
}