php實現(xiàn)二叉樹

二叉樹是數(shù)據(jù)結構中不可忽略的部分酝蜒,但是相關的書籍上很少有用php來實現(xiàn)二叉樹的匕荸,下面是我用php參考C++實現(xiàn)二叉樹的代碼

一森逮、二叉樹的數(shù)組實現(xiàn)方式

<?php
/**
 * 二叉樹數(shù)組表示
 */
class BinaryTree {
    private $size, $array = array();
    //創(chuàng)建樹并初始化節(jié)點
    function __construct($size, $root) {
        $this->size = $size;
        for ($i = 0; $i < $size; $i++) {
              $this->array[$i] = 0;
        }
        $this->array[0] = $root;
    }
    //查詢節(jié)點
    function searchNode($nodeCode) {
        if ($nodeCode >= $this->size || $nodeCode < 0) {
            return false;
        } else {
            if ($this->array[$nodeCode] == 0) {
                return null;
            } else {
                return $this->array[$nodeCode];
            }
        }
    }
    //增加樹節(jié)點
    function addNode($nodeCode, $place, $nodeValue) {
        if ($nodeCode >= $this->size || $nodeCode < 0) {
            return false;
        } else {
            //判斷插入節(jié)點是左孩子還是右孩子
            if ($place == 0) {
                //判斷該位置是否為空谜喊,為空進行插入操作
                if ($this->array[$nodeCode * 2 + 1] == 0) {
                    //判斷該節(jié)點是否是新的葉子節(jié)點,如果是枢赔,則對相應位置進行補0操作
                    if ($nodeCode * 2 + 1 >= $this->size) {
                        for ($i = $this->size; $i < $nodeCode * 2 + 1; $i++) {
                              $this->array[$i] = 0;
                        }
                        $this->size = $nodeCode * 2 + 2;
                        $this->array[$nodeCode * 2 + 1] = $nodeValue;
                    } else {
                        $this->array[$nodeCode * 2 + 1] = $nodeValue;
                    }
                } else {
                    return false;
                }
            } elseif ($place == 1) {
                if ($this->array[$nodeCode * 2 + 2] == 0) {
                    //判斷該節(jié)點是否是新的葉子節(jié)點,如果是拥知,則對相應位置進行補0操作
                    if ($nodeCode * 2 + 2 >= $this->size) {
                        for ($i = $this->size; $i < $nodeCode * 2 + 1; $i++) {
                              $this->array[$i] = 0;
                        }
                        $this->size = $nodeCode * 2 + 3;
                        $this->array[$nodeCode * 2 + 2] = $nodeValue;
                    } else {
                        $this->array[$nodeCode * 2 + 2] = $nodeValue;
                    }
                } else {
                    return false;
                }
            }
        }
    }
    //刪除樹節(jié)點
    function deleteNode($nodeCode) {
        if ($nodeCode >= $this->size || $nodeCode < 0) {
            return false;
        } else {
            $this->array[$nodeCode] = 0;
        }
    }
    //遍歷樹
    function showTree() {
        var_dump($this->array);
    }
    //銷毀樹
    function __destruct() {
        unset($this->array);
    }
}

這種實現(xiàn)方式主要是將二叉樹中的節(jié)點存儲在數(shù)組中踏拜,通過數(shù)組下標索引進而對二叉樹的相關節(jié)點進行操作

二、二叉樹的鏈表實現(xiàn)方式

<?php
error_reporting(E_ALL ^ E_NOTICE);
/**
 * 二叉樹的節(jié)點類
 */
class Node {
    //索引 值 左孩子 右孩子 父節(jié)點
    public $index, $data, $lChild, $rChild, $parentNode;
    function __construct($index, $data, Node $parentNode = null, Node $lChild = null, Node $rChild = null) {
        //構造函數(shù) 用來初始化節(jié)點
        $this->index = $index;
        $this->data = $data;
        $this->lChild = $lChild;
        $this->rChild = $rChild;
        $this->parentNode = $partentNode;
    }
    function SearchNode($nodeIndex) {
        //節(jié)點的搜索方法
        if ($this->index == $nodeIndex) {
            return $this;
        }
        if ($this->lChild != null) {
            if ($this->lChild->index == $nodeIndex) {
                return $this->lChild;
            } else {
                $tempNode = $this->lChild->SearchNode($nodeIndex);
                if ($tempNode != null) {
                    return $tempNode;
                }
            }
        }
        if ($this->rChild != null) {
            if ($this->rChild->index == $nodeIndex) {
                return $this->rChild;
            } else {
                $tempNode = $this->rChild->SearchNode($nodeIndex);
                if ($tempNode != null) {
                    return $tempNode;
                }
            }
        }
        return null;
    }
    function DeleatNode() {
        //節(jié)點的刪除
        if ($this->lChild != null) {
            $this->lChild->DeleatNode();
        }
        if ($this->rChild != null) {
            $this->rChild->DeleatNode();
        }
        if ($this->parentNode != null) {
            if ($this->parentNode->lChild == $this) {
                $this->parentNode->lChild = null;
            } elseif ($this->parentNode->rChild == $this) {
                $this->partentNode->rChild = null;
            }
        }
        unset($this);
    }
    function PreOrderTraversal() {
        //節(jié)點的前序遍歷
        echo $this->data;
        if ($this->lChild != null) {
            $this->lChild->PreOrderTraversal();
        }
        if ($this->rChild != null) {
            $this->rChild->PreOrderTraversal();
        }
    }
    function InOrderTraversal() {
        //節(jié)點的中序遍歷
        if ($this->lChild != null) {
            $this->lChild->InOrderTraversal();
        }
        echo $this->data;
        if ($this->rChild != null) {
            $this->rChild->InOrderTraversal();
        }
    }
    function PostOrderTraversal() {
        //節(jié)點的后序遍歷
        if ($this->lChild != null) {
            $this->lChild->PostOrderTraversal();
        }
        if ($this->rChild != null) {
            $this->rChild->PostOrderTraversal();
        }
        echo $this->data;
    }
}
class Tree {
    private $root;
    //構造樹并初始化根節(jié)點
    function __construct($index, $data) {
        $this->root = new Node($index, $data);
    }
    //搜索節(jié)點
    function SearchNode($nodeIndex) {
        return $this->root->SearchNode($nodeIndex);
    }
    //增加節(jié)點
    function AddNode($nodeIndex, $direction, Node $node) {
        $searchResult = $this->root->SearchNode($nodeIndex);
        if ($searchResult != null) {
            if ($direction == 0) {
                $searchResult->lChild = $node;
                $searchResult->lChild->parentNode = $searchResult;
                 
            } elseif ($direction == 1) {
                $searchResult->rChild = $node;
                $searchResult->rChild->parentNode = $searchResult;
                 
            }
        } else {
            return false;
        }
    }
    //刪除節(jié)點
    function DeleatNode($nodeIndex) {
        if ($this->SearchNode($nodeIndex) != null) {
            $this->SearchNode($nodeIndex)->DeleatNode();
        }
    }
    //前序遍歷
    function PreOrderTraversal() {
        $this->root->PreOrderTraversal();
    }
    //中序遍歷
    function InOrderTraversal() {
        $this->root->InOrderTraversal();
    }
    //后序遍歷
    function PostOrderTraversal() {
        $this->root->PostOrderTraversal();
    }
    //析構函數(shù)
    function __destruct() {
        unset($this);
    }
}


這種實現(xiàn)方式相對于以數(shù)組方式實現(xiàn)二叉樹來說稍微復雜一點低剔,首先速梗,創(chuàng)建一個節(jié)點類,節(jié)點類屬性有索引(index)户侥、數(shù)據(jù)(data)镀琉、左孩子峦嗤、右孩子蕊唐、父節(jié)點,再創(chuàng)建一個二叉樹類烁设,有些在二叉樹類中相對難以實現(xiàn)的方法我們可以放到節(jié)點類中去實現(xiàn)替梨。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市装黑,隨后出現(xiàn)的幾起案子副瀑,更是在濱河造成了極大的恐慌,老刑警劉巖恋谭,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糠睡,死亡現(xiàn)場離奇詭異,居然都是意外死亡疚颊,警方通過查閱死者的電腦和手機狈孔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來材义,“玉大人均抽,你說我怎么就攤上這事∑涞啵” “怎么了油挥?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長款熬。 經(jīng)常有香客問我深寥,道長,這世上最難降的妖魔是什么贤牛? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任惋鹅,我火速辦了婚禮,結果婚禮上盔夜,老公的妹妹穿的比我還像新娘负饲。我一直安慰自己堤魁,他們只是感情好,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布返十。 她就那樣靜靜地躺著妥泉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洞坑。 梳的紋絲不亂的頭發(fā)上盲链,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音迟杂,去河邊找鬼刽沾。 笑死,一個胖子當著我的面吹牛排拷,可吹牛的內(nèi)容都是我干的侧漓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼监氢,長吁一口氣:“原來是場噩夢啊……” “哼布蔗!你這毒婦竟也來了?” 一聲冷哼從身側響起浪腐,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纵揍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后议街,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泽谨,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年特漩,在試婚紗的時候發(fā)現(xiàn)自己被綠了吧雹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拾稳,死狀恐怖吮炕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情访得,我是刑警寧澤龙亲,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站悍抑,受9級特大地震影響鳄炉,放射性物質發(fā)生泄漏。R本人自食惡果不足惜搜骡,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一拂盯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧记靡,春花似錦谈竿、人聲如沸团驱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚎花。三九已至,卻和暖如春呀洲,著一層夾襖步出監(jiān)牢的瞬間紊选,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工道逗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兵罢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓滓窍,卻偏偏與公主長得像卖词,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贰您,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結構坏平,樹與前面介紹的線性表,棧锦亦,隊列等線性結構不同,樹是一種非線性結構 1.樹的定...
    Jack921閱讀 4,452評論 1 31
  • 1 序 2016年6月25日夜令境,帝都杠园,天下著大雨,拖著行李箱和同學在校門口照了最后一張合照舔庶,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,102評論 0 12
  • 文/清一若水 華燈初上 你在心上 一如朦朧的月色 蒙住癡心的甜蜜 會不會晚風留情 繪一樁風雅之事 夜宵夜色晚來夢 ...
    清一若水閱讀 444評論 9 4
  • 緊張的一學期結束了惕橙,迎來了夢寐以求的暑假瞧甩,我很開心。學期里每天都有作業(yè)弥鹦,讓我很苦惱肚逸,我羨慕奶奶在田地里割草。...
    妮妮弟弟閱讀 271評論 0 2
  • 看完央視拍攝的紀錄片《鏡子》彬坏,心情沉重朦促。想不到我們國家有那么多問題家庭。 每一個問題孩子背后都有一對問題父母...
    官小姐不當官閱讀 288評論 1 1