Inorder Tree Traversal | Iterative & Recursive

来源:互联网 发布:ubuntu安装桌面环境 编辑:程序博客网 时间:2024/06/05 07:32

遍历树|迭代和递归

给定一个二叉树,编写迭代和递归解决方案来遍历使用顺序遍历的树。

不同于以线性顺序遍历的链表,一维数组和其他线性数据结构,可以以多种方式以深度优先顺序(in-order, pre-order and post-order)或宽度优先遍历树订单(级别遍历)。除了这些基本遍历之外,各种更复杂或混合的方案是可能的,例如深度限制搜索,如迭代深化深度优先搜索。

遍历树包括以某种方式遍历所有节点。由于树不是线性数据结构,所以从给定的节点可能会有多个可能的下一个节点,因此一些节点必须被延迟,以某种方式存储以备后续访问。遍历可以迭代地进行,其中延迟节点存储在堆栈中,或者可以通过递归完成延迟节点隐式存储在调用堆栈中。

对于按顺序遍历(非空)二进制树,我们必须对从树的根节点开始的每个节点N做这三件事:

(L)递归地遍历其左子树。当这个步骤完成后,我们再次返回N。
(N)过程N本身
(R)递归地遍历其右子树。当这个步骤完成后,我们再次返回N。

在正常的顺序遍历中,我们在右子树之前访问左子树。如果在访问左子树之前访问右子树,则将其称为反向顺序遍历。

###序遍历

在处理任何节点之前我们可以看到,左子树先处理,后跟节点,最后处理右子树。可以为每个节点递归地定义这些操作。递归实现被称为深度优先搜索(DFS),因为搜索树在进入下一个兄弟之前尽可能地加深每个孩子的深度。

C ++实现 -

    //递归函数执行树的顺序遍历    void inorder(Node *root)    {       //如果当前节点为空,则返回        if (root == nullptr)            return;          //遍历左子树        inorder(root->left);        //显示根(或当前节点)的数据部分        cout << root->data << " ";        //遍历正确的子树        inorder(root->right);    }

迭代实现 -

要将上述递归过程转换为迭代过程,我们需要一个显式堆栈。下面是一个简单的基于堆栈的迭代算法来进行顺序遍历。

    iterativeInorder(node)    s -> empty stack    while (not s.isEmpty() or node -> null)       if (node -> null)          s.push(node)          node -> node.left       else          node -> s.pop()          visit(node)          node -> node.right

C ++实现 -

//迭代函数来执行树的顺序遍历    void inorderIterative(Node *root)    {         //创建一个空堆栈        stack<Node*> stack;         //从根节点开始(将当前节点设置为根节点        Node *curr = root;        //如果当前节点为空,堆栈也为空,我们就完成        while (!stack.empty() || curr != nullptr)        {             //如果当前节点不为空,将其推送到堆栈(推迟它)        //并移动到其左边的孩子            if (curr != nullptr)            {                stack.push(curr);                curr = curr->left;            }            else            {                 // else如果当前节点为null,我们从堆栈中弹出一个元素,            //打印它,最后将当前节点设置为其对应的子节点                curr = stack.top();                stack.pop();                cout << curr->data << " ";                curr = curr->right;            }        }    }

上述解决方案的时间复杂度为O(n),并且程序的空间复杂度为O(n),因为所需的空间与树的高度成比例,在最差情况下可能与树的节点数相等。 。