二叉查找樹(Binary Search Tree)

定義

  • 二叉樹

二叉樹在圖論中是這樣定義的:二叉樹是一個連通的無環(huán)圖沃于,并且每一個頂點的度不大于3乍构。有根二叉樹還要滿足根結(jié)點的度不大于2。有了根結(jié)點之后汁针,每個頂點定義了唯一的父結(jié)點干签,和最多2個子結(jié)點津辩。然而,沒有足夠的信息來區(qū)分左結(jié)點和右結(jié)點容劳。如果不考慮連通性喘沿,允許圖中有多個連通分量,這樣的結(jié)構(gòu)叫做森林竭贩。

  • 二叉查找樹

二叉排序樹或者是一棵空樹蚜印,或者是具有下列性質(zhì)的二叉樹:
(1)若左子樹不空,則左子樹上所有結(jié)點的值均小于或等于它的根結(jié)點的值娶视;
(2)若右子樹不空晒哄,則右子樹上所有結(jié)點的值均大于或等于它的根結(jié)點的值睁宰;
(3)左、右子樹也分別為二叉排序樹寝凌;

實現(xiàn)二叉查找樹

BST 的基本方法

要實現(xiàn)二叉查找樹柒傻,首先實現(xiàn) Node 類,Node 類定義如下:


function Node(data, left, right) {
    this.data = data;
    this.left = left;
    this.right = right;
    this.show = show;
}

我們可以定義一個二叉查找樹類(BST)如下:

// BST類
function BST() {
    this.root = null;
    this.insert = insert; // 插入數(shù)據(jù)方法
}

接著我們實現(xiàn)一個 insert 方法较木,實現(xiàn)這個方法的思路:

首先檢查 BST 是否有根節(jié)點红符,如果沒有,則這是一個新樹伐债,這個需要插入的數(shù)據(jù)就成為了根節(jié)點预侯,這個方法就完成了;否則峰锁,進入下一步萎馅。

  1. 設(shè)置根節(jié)點為當(dāng)前節(jié)點。

  2. 如果待插入數(shù)據(jù)小于當(dāng)前節(jié)點的數(shù)據(jù)虹蒋,則設(shè)置新的當(dāng)前節(jié)點為原節(jié)點的左節(jié)點糜芳;反之,執(zhí)行第4步魄衅。

  3. 如果當(dāng)前節(jié)點的左節(jié)點為null峭竣,那么就將新的節(jié)點插入這個位置,退出循環(huán)晃虫;反之皆撩,繼續(xù)執(zhí)行下一次循環(huán)。

  4. 設(shè)置新的當(dāng)前節(jié)點為原節(jié)點的右節(jié)點哲银。

  5. 如果當(dāng)前節(jié)點的右節(jié)點為null扛吞,那么就將新的節(jié)點插入這個位置,退出循環(huán)盘榨;反之喻粹,繼續(xù)執(zhí)行下一次循環(huán)。

所以草巡,我們現(xiàn)在可以實現(xiàn) insert 方法如下:

function insert(data) {
    var n = new Node(data, null, null);
    var parent;
    if(this.root == null) {
        this.root = n;
    } else {
        while(true) {
            parent = current;
            if (data < current.data ) {
                current = current.left;
                if (!current)  {
                    parent.left = n;
                    break;
                }
            } else {
                current = current.right;
                if (!current) {
                    parent.right = n;
                    break;
                }
            }
        }
    }
}

遍歷二叉查找樹

BST 類目前已經(jīng)初步成型,我們已經(jīng)可以插入數(shù)據(jù)型酥,現(xiàn)在我們還需要有能力遍歷
BST 山憨, 我們有三種遍歷 BST 的方式: 中序、先序和后序弥喉。

前序遍歷:根節(jié)點->左子樹->右子樹
中序遍歷:左子樹->根節(jié)點->右子樹
后序遍歷:左子樹->右子樹->根節(jié)點

則 BST 類現(xiàn)在可以寫成如下:

// BST類
function BST() {
    this.root = null;
    this.insert = insert; // 插入數(shù)據(jù)方法
    this.inOrder = inOrder; // 中序遍歷
    this.preOrder = preOrder; // 先序遍歷
    this.postOrder = postOrder; // 后序遍歷
}

現(xiàn)在我們首先實現(xiàn)中序遍歷方法如下:

function inOrder(node) {
    if(node) {
        inOrder(node.left);
        console.log(node.show() + " ");
        inOrder(node.right);
    }
}

先序遍歷如下:

// 先序遍歷 
function  preOrder (node) {
    if (node) {
        console.log(node.show()+"");
        preOrder(node.left);
        preOrder(node.right);
    }
}

后序遍歷如下:

// 后序遍歷
function postOrder(node) {
    if (node) {
        postOrder(node.left);
        postOrder(node.right);
        console.log(node.show()+"");
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末郁竟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子由境,更是在濱河造成了極大的恐慌棚亩,老刑警劉巖蓖议,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異讥蟆,居然都是意外死亡勒虾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門瘸彤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來修然,“玉大人,你說我怎么就攤上這事质况°邓危” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵结榄,是天一觀的道長中贝。 經(jīng)常有香客問我,道長臼朗,這世上最難降的妖魔是什么雄妥? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮依溯,結(jié)果婚禮上老厌,老公的妹妹穿的比我還像新娘。我一直安慰自己黎炉,他們只是感情好枝秤,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慷嗜,像睡著了一般淀弹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庆械,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天薇溃,我揣著相機與錄音,去河邊找鬼缭乘。 笑死沐序,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的堕绩。 我是一名探鬼主播策幼,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奴紧!你這毒婦竟也來了特姐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤黍氮,失蹤者是張志新(化名)和其女友劉穎唐含,沒想到半個月后浅浮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡捷枯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年滚秩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铜靶。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡叔遂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出争剿,到底是詐尸還是另有隱情已艰,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布蚕苇,位于F島的核電站哩掺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涩笤。R本人自食惡果不足惜嚼吞,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹬碧。 院中可真熱鬧舱禽,春花似錦、人聲如沸恩沽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罗心。三九已至里伯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間渤闷,已是汗流浹背疾瓮。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留飒箭,地道東北人狼电。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像补憾,于是被迫代替她去往敵國和親漫萄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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

  • 二叉查找樹(Binary Sort Tree) 我們之前所學(xué)到的列表盈匾,棧等都是一種線性的數(shù)據(jù)結(jié)構(gòu),今天我們將學(xué)習(xí)計...
    Cryptic閱讀 5,008評論 1 19
  • 二叉查找樹擁有如下特性: 若左子樹不空毕骡,則左子樹上所有結(jié)點的值均小于或等于它的根結(jié)點的值削饵; 若右子樹不空岩瘦,則右子樹...
    zhuke閱讀 377評論 0 2
  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹與前面介紹的線性表窿撬,棧启昧,隊列等線性結(jié)構(gòu)不同,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,457評論 1 31
  • 四、樹與二叉樹 1. 二叉樹的順序存儲結(jié)構(gòu) 二叉樹的順序存儲就是用數(shù)組存儲二叉樹跛璧。二叉樹的每個結(jié)點在順序存儲中都有...
    MinoyJet閱讀 1,537評論 0 7
  • 0. 什么是樹 數(shù)據(jù)的基本單位是數(shù)據(jù)元素严里,在涉及到數(shù)據(jù)處理時數(shù)據(jù)元素之間的關(guān)系稱之為結(jié)構(gòu),我們依據(jù)數(shù)據(jù)元素之間關(guān)系...
    安安zoe閱讀 487評論 0 0