php-二叉樹

二叉樹的基本知識就不說了,談一些有意思的問題!

想要存儲一棵二叉樹急侥,我們有兩種方法

一種是基于指針或者引用的二叉鏈?zhǔn)酱鎯Ψǎ?br> 一種是基于數(shù)組的順序存儲法。

鏈?zhǔn)酱鎯?/code> 大部分二叉樹代碼都是通過這種結(jié)構(gòu)來實現(xiàn)的秒啦。

鏈?zhǔn)酱鎯?/div>

每個節(jié)點有 3 個字段,data 存儲數(shù)據(jù)搀玖,另外兩個是指向左右子節(jié)點的指針

順序存儲 存儲適用性不強余境,一般只用于完全二叉樹

順序存儲

二叉樹的遍歷

二叉樹的遍歷方式有很多,如果限制了從左到右的習(xí)慣方式灌诅,那么主要就分為四種:

  • 前序遍歷(DLR):根結(jié)點芳来,遍歷左子樹,遍歷右子樹【根左右】百度百科

    前序遍歷: ABDGHCEIF

  • 中序遍歷(LDR):遍歷左子樹猜拾,根結(jié)點即舌,遍歷右子樹【左根右】百度百科

    中序遍歷: GDHBAEICF

  • 后序遍歷(LRD):遍歷左子樹,遍歷右子樹挎袜,根結(jié)點【左右根】百度百科

    后序遍歷:GHDBIEFCA

  • 層序遍歷:從根結(jié)點顽聂,從上而下逐層遍歷


    層序遍歷:ABCDEFGHI

那為什么要有這么多遍歷方法呢

我們用圖形的方式來表現(xiàn)樹的結(jié)構(gòu),可以非常直觀的理解盯仪,但是對于計算機來說紊搪,它只有循環(huán)、判斷等方式來處理全景,換種方式說耀石,就是它只會處理線性序列,而剛才四種遍歷方法爸黄,都是把樹中的結(jié)點變成某種意義的線性結(jié)構(gòu)滞伟。

推導(dǎo)二叉樹

很多面試會問這個問題揭鳞。給出前序ABCDEF,中序CBAEDF梆奈,問后序是什么野崇?
其實很簡單前序先訪問根結(jié)點 A,中序 A 左邊就是左子樹亩钟,可以根據(jù)上面的圖自己推導(dǎo)著畫一下乓梨,結(jié)果CBEFDA

簡單的二叉樹代碼實現(xiàn)

class node
{
    public $data   = null;
    public $left   = null;
    public $right  = null;
    public $parent = null;

    function __construct($data)
    {
        $this->data = $data;
    }
}

class tree
{
    public $root  = null;
    public $size  = 0;
    public $depth = null;

    function __construct($data)
    {
        $this->root = new node($data);
        $this->size++;
        $this->depth++;
    }

    function addNode($arr)
    {
        foreach ($arr as $value) {
            $current     = $this->root;
            $parent      = null;
            $currentDept = 1;

            while ($current !== null) {
                $parent = $current;
                if ($value == $current->data) {
                    continue 2;
                } elseif ($current->data > $value) {
                    $current = $current->left;
                } else {
                    $current = $current->right;
                }
                $currentDept++;
            }
            $node         = new node($value);
            $node->parent = $parent;
            if ($parent->data > $value) {
                $parent->left = $node;
            } else {
                $parent->right = $node;
            }

            if ($this->depth < $currentDept) {
                $this->depth++;
            }
            $this->size++;
        }

        return true;
    }

    function showTree()
    {
        return $this->root;
    }
}

二叉查找樹

查找樹其實就是在規(guī)則上限制了數(shù)據(jù)。它不僅僅支持快速查找一個數(shù)據(jù)径荔,還支持快速插入、刪除一個數(shù)據(jù)脆霎。

它是怎么做到這些的呢总处?

二叉查找樹要求,在樹中的任意一個節(jié)點睛蛛,其左子樹中的每個節(jié)點的值鹦马,都要小于這個節(jié)點的值,而右子樹節(jié)點的值都大于這個節(jié)點的值忆肾。

時間復(fù)雜度其實都跟樹的高度成正比 O(logn)

散列表和二叉查找樹

散列表的插入荸频、刪除、查找操作的時間復(fù)雜度可以做到常量級的 O(1)
二叉查找樹在比較平衡的情況下客冈,插入旭从、刪除、查找操作時間復(fù)雜度才是 O(logn)
相對散列表场仲,好像并沒有什么優(yōu)勢和悦,那我們?yōu)槭裁催€要用二叉查找樹呢?

  • 如果要輸出有序數(shù)據(jù)渠缕,散列表就要先排序鸽素,二叉樹則可以通過中序遍歷在 O(n) 時間復(fù)雜度內(nèi)輸出
  • 散列表擴容耗時很多,而且當(dāng)遇到散列沖突時亦鳞,性能不穩(wěn)定馍忽,盡管二叉查找樹的性能不穩(wěn)定,但我們最常用的平衡二叉查找樹的性能非常穩(wěn)定燕差,時間復(fù)雜度穩(wěn)定在 O(logn)遭笋。
  • 盡管散列表的查找等操作的時間復(fù)雜度是常量級的,平衡二叉查找樹是 O(logn) 但因為哈希沖突的存在徒探,這個常量不一定比 logn 小坐梯,所以實際的查找速度可能不一定快
  • 散列表的構(gòu)造比二叉查找樹要復(fù)雜,需要考慮的東西很多刹帕。比如散列函數(shù)的設(shè)計吵血、沖突解決辦法谎替、擴容、縮容等蹋辅。平衡二叉查找樹只需要考慮平衡性這一個問題钱贯,而且這個問題的解決方案比較成熟、固定侦另。
  • 為了避免過多的散列沖突秩命,散列表裝載因子不能太大,特別是基于開放尋址法解決沖突的散列表褒傅,不然會浪費一定的存儲空間弃锐。

平衡二叉查找樹,紅黑樹殿托?紅黑樹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末霹菊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子支竹,更是在濱河造成了極大的恐慌旋廷,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件礼搁,死亡現(xiàn)場離奇詭異饶碘,居然都是意外死亡,警方通過查閱死者的電腦和手機馒吴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門扎运,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饮戳,你說我怎么就攤上這事绪囱。” “怎么了莹捡?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵鬼吵,是天一觀的道長。 經(jīng)常有香客問我篮赢,道長齿椅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任启泣,我火速辦了婚禮涣脚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寥茫。我一直安慰自己遣蚀,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芭梯,像睡著了一般险耀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玖喘,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天甩牺,我揣著相機與錄音,去河邊找鬼累奈。 笑死贬派,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的澎媒。 我是一名探鬼主播搞乏,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戒努!你這毒婦竟也來了请敦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤柏卤,失蹤者是張志新(化名)和其女友劉穎冬三,沒想到半個月后匀油,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缘缚,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年敌蚜,在試婚紗的時候發(fā)現(xiàn)自己被綠了桥滨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡弛车,死狀恐怖齐媒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纷跛,我是刑警寧澤喻括,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站贫奠,受9級特大地震影響唬血,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唤崭,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一拷恨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谢肾,春花似錦腕侄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽微姊。三九已至,卻和暖如春拌汇,著一層夾襖步出監(jiān)牢的瞬間柒桑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工噪舀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留魁淳,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓与倡,卻偏偏與公主長得像界逛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纺座,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353