0

我正在玩写一棵二叉树。目前它不会是完整的,或者它的每个级别都已满。我只是想让插入以最基本的形式工作(之后我会搞乱重新排序)。

编码

<?php

class Node {
    public $left = NULL;
    public $right = NULL;
    public $data = NULL;
}

class BinaryTree {
private $root = NULL;

public function insert($value, $node = false) {
    echo "VALUE: $value \n";
    if($node === false) {
        $node = $this->root;
    }

    if($node->data === NULL) {  // Always stuck here.
        $node->data = $value;
    } else {
        if($value <= $node->data) {
            $this->insert($value, $node->left);
        } else if($value >= $node->data) {
            $this->insert($value, $node->right);
        }
    }
}

}

$t = new BinaryTree();
$t->insert(7);
$t->insert(6);
$t->insert(1);

?>

问题是,当我分配 $node->value 某些东西时,$node 对象似乎没有正确地传递到 insert() 函数中。因此,它永远不会通过根。

编辑

@Joost 指出我错过了几个步骤。这使我在 BinaryTree 课程中得到以下内容:

public function __construct() {
    $this->root = new Node();
}
public function insert($value, $node = false) {
    if($node === false) {
        $node = $this->root;
    }

    if($node->data === NULL) {
        $node->data = $value;
    } else {
        if($value <= $node->data) {
            if(get_class($node->left) != "Node") {
                $node->left = new Node();
            }
            $this->insert($value, $node->left);
        } else if($value >= $node->data) {
            if(get_class($node->right) != "Node") {
                $node->rght = new Node();
            }
            $this->insert($value, $node->right);
        }
    }
}
4

1 回答 1

2

它不起作用,因为您从未初始化根。您可以使用始终为空的根 (init it in __construct) 或在插入时直接将新节点分配给根(如果尚未设置根)。

实际上,这个问题适用于所有节点。您永远不会创建Node实例,也不会将节点设置为父节点的子节点。

于 2012-07-15T21:08:12.947 回答