【问题标题】:Construct binary tree given its inorder and preorder traversals without recursion在没有递归的情况下构造二叉树给定它的中序和前序遍历
【发布时间】:2018-06-29 08:50:24
【问题描述】:

给定树的中序和前序遍历,如何以非递归方式重新构造树。

例如:

重新构造下面的树

                     1
       2                             3
 4           5                6             7
                  8                     9

给定

中序遍历:4、2、5、8、1、6、3、9、7

前序遍历:1、2、4、5、8、3、6、7、9

注意:有很多关于递归实现的参考。例如,可以参考Construct Tree from given Inorder and Preorder traversals。然而,这里的意图是找到非递归实现。

【问题讨论】:

  • 递归使用调用栈来保存信息。要在不递归的情况下做同样的事情,只需创建一个数据堆栈来保存该信息。

标签: algorithm recursion tree iteration binary-tree


【解决方案1】:

想法是在 preorder 遍历中将树节点保持在堆栈中,直到在 inorder 遍历中找不到它们的对应节点。一旦找到对应节点,则该节点左子树中的所有子节点必须已被访问过。

以下是非递归 Java 实现。

public TreeNode constructTree(int[] preOrder, int[] inOrder) {

    if (preOrder.length == 0) {
      return null;
    }

    int preOrderIndex = 0;
    int inOrderIndex = 0;

    ArrayDeque<TreeNode> stack = new ArrayDeque<>();

    TreeNode root = new TreeNode(preOrder[0]);
    stack.addFirst(root);
    preOrderIndex++;

    while (!stack.isEmpty()) {

      TreeNode top = stack.peekFirst();

      if (top.val == inOrder[inOrderIndex]) {

        stack.pollFirst();
        inOrderIndex++;

        // if all the elements in inOrder have been visted, we are done
        if (inOrderIndex == inOrder.length) {
          break;
        }

        // Check if there are still some unvisited nodes in the left
        // sub-tree of the top node in the stack
        if (!stack.isEmpty()
            && stack.peekFirst().val == inOrder[inOrderIndex]) {
          continue;
        }

        // As top node in stack, still has not encontered its counterpart
        // in inOrder, so next element in preOrder must be right child of
        // the removed node
        TreeNode node = new TreeNode(preOrder[preOrderIndex]);
        preOrderIndex++;
        top.right = node;
        stack.addFirst(node);

      } else {
        // Top node in the stack has not encountered its counterpart
        // in inOrder, so next element in preOrder must be left child
        // of this node
        TreeNode node = new TreeNode(preOrder[preOrderIndex]);
        preOrderIndex++;
        top.left = node;
        stack.addFirst(node);
      }
    }

    return root;
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多