我在 PHP 中实现了一个 AVL 树(一种自平衡二叉搜索树),并且工作正常。我有按顺序、预顺序和级别顺序迭代器工作,但我不知道如何为 BST 执行后序迭代器。谷歌搜索出现了如何进行迭代后序遍历,但不是迭代器。
到目前为止,我唯一的成功是使用后序遍历来构建一个数组,然后返回一个数组迭代器。这很糟糕,因为它对树进行了两次迭代并增加了更多的空间复杂度。
构建后序迭代器的一般算法是什么?
php标记在这里的唯一原因是PHP中的迭代器与 Java 或 C++ 中的迭代器不同。它可能会影响您的建议。
此外,如果 PHP 有生成器,这将是一件轻而易举的事,因为后序遍历可以简单地产生值,将其变成一个迭代器。. .
编辑:这是按顺序迭代器实现。也许它可以帮助您了解我对后序迭代器的要求:
class InOrderIterator implements Iterator {
/**
* @var ArrayStack
*/
protected $stack;
/**
* @var BinaryNode
*/
protected $root;
/**
* @var BinaryNode
*/
protected $value;
public function __construct(BinaryNode $root) {
$this->stack = new ArrayStack;
$this->root = $root;
}
/**
* @link http://php.net/manual/en/iterator.current.php
* @return mixed
*/
public function current() {
return $this->value->getValue();
}
/**
* @link http://php.net/manual/en/iterator.next.php
* @return void
*/
public function next() {
/**
* @var BinaryNode $node
*/
$node = $this->stack->pop();
$right = $node->getRight();
if ($right !== NULL) {
// left-most branch of the right side
for ($left = $right; $left !== NULL; $left = $left->getLeft()) {
$this->stack->push($left);
}
}
if ($this->stack->isEmpty()) {
$this->value = NULL;
return;
}
$this->value = $this->stack->peek();
}
/**
* @link http://php.net/manual/en/iterator.key.php
* @return NULL
*/
public function key() {
return NULL; //no keys in a tree . . .
}
/**
* @link http://php.net/manual/en/iterator.valid.php
* @return boolean
*/
public function valid() {
return $this->value !== NULL;
}
/**
* @link http://php.net/manual/en/iterator.rewind.php
* @return void
*/
public function rewind() {
$this->stack->clear();
for ($current = $this->root; $current !== NULL; $current = $current->getLeft()) {
$this->stack->push($current);
}
$this->value = $this->stack->peek();
}
}