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

ルートを初期化しないため、機能しません。__constructルートがまだ設定されていない場合は、常に空のルートを使用するか ( で初期化)、挿入時にルートに新しいノードを直接割り当てることができます。

実際、この問題はすべてのノードに当てはまります。インスタンスを作成しNodeたり、ノードを親の子として設定したりすることはありません。

于 2012-07-15T21:08:12.947 に答える