談PHP的二叉樹的表示

PHP已經發行到了5.2.10了,5.3.0rc4也已公佈。6.0早就出了測試版。PHP是日趨完美。呵呵

但是在C++/C中有個重要的概念就是鏈表。而鏈表中有個重要概念就是二叉樹。實現二叉樹關鍵是一個節點如何表示。

我們知道C++/C中可以使用以下代碼表示一個二叉樹的節點(使用模板):

template <class elemType>

struct nodeType

{

    elemType info;

    nodeType<elemType> *llink;

    nodeType<elemType> *rlink;

}

如果只是C++語法可以使用類表示.

template <class elemType>

class nodeType

{

public:

    elemType info;

    nodeType<elemType> *llink;

    nodeType<elemType> *rlink;

.........................

}

而PHP應該如何表示呢?PHP裏是沒有指針的,但有引用。而引用的效果其實與指針是差不多的。

當然PHP也沒有struct,因此節點可以使用類來代替。

我們可以構造一個如下類:

class nodeType
{
  var $key;
  var $left, $right;
 
  function nodeType($key, $left = null, $right = null)
  {
     $this->key = $key;
     $this->left = &$left;
     $this->right = &$right;
  }
}

用更標準點的類表示。(注意:比較早的PHP就不支持了)

class nodeType
{
  public $key;
  public $left, $right;
 
  public function nodeType($key, $left = null, $right = null)
  {
     $this->key = $key;
     $this->left = &$left;
     $this->right = &$right;
  } 
}

這裏只是簡單介紹二叉樹的節點方法,就不具體實現二叉樹了。相信對於有C++/C或java寫過二叉樹經驗或參考C++/C或java二叉樹代碼應該實現起來很簡單。

以上代碼是否可以真的實現二叉樹呢?我就簡單的使用以下代碼驗證一下。

// 構建一個根,和左右子樹

$leftNode = new nodeType(1);
$rightNode = new nodeType(10);
$rootNode = new nodeType(null, &$leftNode, &$rightNode);   // 注意此處要傳入引用
echo ++$rootNode->right->key;
echo '<br>';
echo $rightNode->key;

輸出

11
11

// 在左子樹再下添加一個節點

$leftLeftNode = new nodeType(12);
$rootNode->left->left = &$leftLeftNode;  // 注意引用
echo $rootNode->left->key;
echo '<br>';
echo ++$rootNode->left->left->key;
echo '<br>';
echo $leftLeftNode->key;

輸出

1
13
13

 

// 刪除一個節點,直接賦值爲null

$rootNode->left->left = null;

echo $rootNode->left->key;

echo '<br>';

echo $rootNode->left->left->key;

echo '<br>';

echo $leftLeftNode->key;

echo '<br>';

echo '*';

輸出

1


*

由於PHP沒有指針,不用擔心所謂“野指針”,比較安全。其實在java也是使用這種方法實現鏈表的。

看以上結果,二叉樹是有效的。具體實現一個二叉樹還需要讀者去實現了,這裏就不講了。可以參考C++書本里的二叉樹實現。

網上還有一些其他的方法,但我覺得該方法比較好,基本上和C++中的二叉樹是一樣的了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章