在给定输入节点的二叉树中打印祖先节点,而不在java中使用递归

时间:2016-02-24 04:55:41

标签: java algorithm binary-tree

如何在没有递归的情况下获取二叉树的祖先节点。我使用递归获得了以下代码,但是如果不使用递归则无法弄清楚如何获取。

value

1 个答案:

答案 0 :(得分:0)

一种简单的方法涉及某种“待办事项列表”,以及Map来跟踪祖先。待办事项列表可以是队列或堆栈。基本计划是这样的:

  • 初始化待办事项列表以仅包含根
  • 虽然待办事项列表不为空:
    • 从待办事项列表中获取下一个节点N
    • 如果N是您的目标,请停止
    • 如果N.left不为null,则将(N.left,N)添加到“祖先”地图中。此映射将允许您查找所访问的任何节点的祖先。
    • 如果N.right不为null,请将(N.right,N)添加到“祖先”地图
    • 如果N.left不为null,请将其添加到待办事项列表
    • 如果N.right不为null,请将其添加到待办事项列表

此时,目标的父母,祖父母等一直在链中,将在“祖先”地图中,因此打印所有祖先应该很容易。

如果您使用堆栈作为待办事项列表,则应在N.right之前将N.left推送到堆栈。然后你将按顺序遍历树。

如果您为待办事项列表使用队列,以便在末尾添加元素并从头开始检索它们,那么我认为遍历顺序将是广度优先搜索,其中我们遍历根,然后是下一级别的所有节点,然后是该级别以下的所有节点,等等。

这是我能想到的最简单的答案,它可以提供一个模板,用于解决其他树遍历问题而无需递归。 (另外它适用于其他类型的图形,如果你添加逻辑以确保你不会两次访问节点。)就空间效率而言,它不是最好的答案。有些想法,你可以想出一个不使用Map的算法,并且不会将一个节点的子节点推送到堆栈或队列上(这样最大堆栈大小会更小)