Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++中的二叉搜索树遍历_C++_Binary Search Tree_Tree Traversal - Fatal编程技术网

C++中的二叉搜索树遍历

C++中的二叉搜索树遍历,c++,binary-search-tree,tree-traversal,C++,Binary Search Tree,Tree Traversal,下面是我的二进制搜索树的实现 看看打印功能 根据我的理解,我已经实现了顺序遍历。我说得对吗 其次,我如何修改print以实现预订单和后订单遍历?在您的脑海中,逐步完成该函数的前几行。是否清楚打印的第一个树节点始终是根节点?这与顺序遍历不同。您实现的是预顺序。唯一的区别是std:的位置:cout@MadKarel,将左侧和右侧子项推到堆栈的顺序重要吗?@DrewDormann,将左侧和右侧子项推到堆栈的顺序重要吗?您是否难以找到该问题的答案?这似乎很容易测试,所以我不知道你为什么要问它。 #inc

下面是我的二进制搜索树的实现

看看打印功能

根据我的理解,我已经实现了顺序遍历。我说得对吗


其次,我如何修改print以实现预订单和后订单遍历?

在您的脑海中,逐步完成该函数的前几行。是否清楚打印的第一个树节点始终是根节点?这与顺序遍历不同。您实现的是预顺序。唯一的区别是std:的位置:cout@MadKarel,将左侧和右侧子项推到堆栈的顺序重要吗?@DrewDormann,将左侧和右侧子项推到堆栈的顺序重要吗?您是否难以找到该问题的答案?这似乎很容易测试,所以我不知道你为什么要问它。
#include <iostream>
#include "Stack.hpp"

namespace binary_search_tree_no_recursion_namespace
{
    struct Node
    {
        int data;
        Node * nextLeft;
        Node * nextRight;
    };

    class BinarySearchTree
    {
    private:
        linked_stack_namespace::Stack<Node*> stack;
        Node * root;

    public:
        BinarySearchTree(): root(nullptr){}
        void add_node(int value)
        {
            Node * newNode = new Node();
            newNode->data = value;
            newNode->nextLeft = nullptr;
            newNode->nextRight = nullptr;

            Node * copyOfRoot = root;
            if(copyOfRoot == nullptr)
            {
                root = newNode;
            }
            else
            {
                while (copyOfRoot != nullptr)
                {
                    if (copyOfRoot->data > value)
                    {
                        if (copyOfRoot->nextLeft == nullptr)
                        {
                            copyOfRoot->nextLeft = newNode;
                            break;
                        }
                        else
                        {
                            copyOfRoot = copyOfRoot->nextLeft;
                        }
                    }
                    if (copyOfRoot->data <= value)
                    {
                        if (copyOfRoot->nextRight == nullptr)
                        {
                            copyOfRoot->nextRight = newNode;
                            break;
                        }
                        else
                        {
                            copyOfRoot = copyOfRoot->nextRight;
                        }
                    }
                }
            }
        }
        void print()
        {
            stack.push(root);
            while(!stack.is_empty())
            {
                Node * poppedNode = stack.pop();
                std::cout<<poppedNode->data;

                if(poppedNode->nextRight != nullptr)
                {
                    stack.push(poppedNode->nextRight);
                }

                if(poppedNode->nextLeft != nullptr)
                {
                    stack.push(poppedNode->nextLeft);
                }
            }
        }
    public:
        static void Test()
        {
            BinarySearchTree tree;

            tree.add_node(5);
            tree.add_node(4);
            tree.add_node(6);
            tree.add_node(2);
            tree.add_node(1);
            tree.add_node(3);

            tree.print();
        }
    };
}