gpt4 book ai didi

php - 二叉搜索树后序迭代器

转载 作者:搜寻专家 更新时间:2023-10-31 22:12:06 26 4
gpt4 key购买 nike

我正在用 PHP 实现一个 AVL 树(一个自平衡的二叉搜索树)并且一切正常。我有有序、预序和层序 迭代器 工作,但我无法弄清楚如何为 BST 执行后序迭代器。 Google 搜索显示了如何进行迭代后序遍历,但没有显示迭代器。

到目前为止,我唯一的成功是使用后序遍历来构建一个数组,然后返回一个数组迭代器。这很糟糕,因为它对树进行了两次迭代并增加了更多的空间复杂度。

构建后序迭代器的一般算法是什么?

的唯一原因这里的标记是 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();
}
}

最佳答案

我几乎可以将 C++ 中的迭代遍历示例转换为迭代器。 Latest on github .还需要搞清楚几个案例。

class PostOrderIterator implements Iterator {

/**
* @var ArrayStack
*/
protected $stack;

/**
* @var BinaryNode
*/
protected $root;

/**
* @var BinaryNode
*/
protected $value;

protected $current;

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->current->getValue();
}

/**
* @link http://php.net/manual/en/iterator.next.php
* @return void
*/
public function next() {
/**
* @var BinaryNode $node
*/
if ($this->value !== NULL) {
$right = $this->value->getRight();
if ($right !== NULL) {
$this->stack->push($right);
}
$this->stack->push($this->value);
$this->value = $this->value->getLeft();
$this->next();
return;
}

if ($this->stack->isEmpty()) {
$this->current = $this->value;
$this->value = NULL;
return;
}

$this->value = $this->stack->pop();

$right = $this->value->getRight();
if ($right !== NULL && !$this->stack->isEmpty() && ($right === $this->stack->peek())) {
$this->stack->pop();
$this->stack->push($this->value);
$this->value = $this->value->getRight();
$this->current = $this->value;
} else {

if ($this->current === $this->value) {
$this->value = NULL;
$this->next();
} else {
$this->current = $this->value;
$this->value = NULL;
}
}

}

/**
* @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->current !== NULL;
}

/**
* @link http://php.net/manual/en/iterator.rewind.php
* @return void
*/
public function rewind() {
$this->stack->clear();

$this->value = $this->root;
$this->next();
}
}

我无法描述该算法或证明它在做什么,但希望随着时间的推移它会有意义。

关于php - 二叉搜索树后序迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11801536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com