为了简单起见,我使用名为Node
的类构建基本二进制搜索树,我将包含用于insert
节点的核心方法
public function addNode($node)
{
if ($this->left == null && $node->getValue() < $this->value) {
$this->left = $node;
$this->left->parent = $this;
return;
}
if ($this->right == null && $node->getValue() > $this->value) {
$this->right = $node;
$this->right->parent = $this;
return;
}
if ($node->getValue() < $this->getValue()) {
$this->left->addNode($node);
return;
}
if ($node->getValue() > $this->getValue()) {
$this->right->addNode($node);
return;
}
}
我在Node类中有这些基本的成员变量
private $left = null;
private $right = null;
private $value = null;
private $parent = null;
我可以通过简单地向其添加节点来构建树。
$node = new Node(5);
$node->addNode(new Node(7));
$node->addNode(new Node(3));
$node->addNode(new Node(4));
现在问题是如果我想要打印树的漂亮文本图表,我如何遍历树。我对如何在树的特定级别上遍历感到困惑。在构建树时我错过了一个重要的变量吗?
答案 0 :(得分:3)
广泛的第一次遍历就是你要找的东西:
printTree($root) {
$queue = array($root);
while ( count($queue) ) {
$node = array_shift($queue);
echo $node;
if($node->left != null)
array_unshift($node->left);
if($node->right != null)
array_unshift($node->right);
}
}
Samuel已经告诉过你关于广泛的第一次遍历,因为我正在编写这个小函数但仍然......我认为这就是你要找的东西。
答案 1 :(得分:2)
答案将取决于您想要遍历树的顺序,但是一般的深度优先遍历将如下所示:
function traverseTree($rootNode) {
if($rootNode->left != null)
traverseTree($rootNode->left);
if($rootNode->right != null)
traverseTree($rootNode->right);
echo $rootNode->value;
}
从评论中你想要广度优先遍历。在Java中查看关于广度优先遍历的这个问题。您可以应用相同的算法。 How do implement a breadth first traversal?