二叉搜索樹(Binary Search Tree)

二叉搜索樹(Binary Search Tree)又稱二叉查找樹催享、二叉排序樹它或者是一棵空樹倒谷,或者是具有下列性質(zhì)的二叉樹: 若它的左子樹不空巷燥,則左子樹上所有結(jié)點的值均大于它的根結(jié)點的值陨献; 若它的右子樹不空俯艰,則右子樹上所有結(jié)點的值均小于它的根結(jié)點的值捡遍; 它的左、右子樹也分別為二叉排序樹(下文稱BST)竹握。

(一)BST的儲存結(jié)構(gòu)
通常一個BST節(jié)點是由左右子節(jié)點和上父節(jié)點加上一個值組成画株。

儲存結(jié)構(gòu).png

(二)BST的添加節(jié)點
由于BST自身的特性,每一個插入節(jié)點都會插入一個當(dāng)前樹的空節(jié)點位置啦辐,位置的選擇滿足左大右形酱(或右大左小)芹关。

添加節(jié)點.png

(三)BST的遞歸遍歷
BST的遞歸遍歷很簡單续挟,直接看代碼吧。

遞歸遍歷.png

(四)BST的迭代遍歷
BST的兩種遍歷都比較重要侥衬,迭代遍歷要考慮到的因素要比遞歸迭代多很多诗祸。我這里采取的是移動節(jié)點的方式依次取到所有的極左位置(已取過的值不算)。

迭代遍歷.png

遍歷之后輸出


演示png
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/// <summary>
/// Binary Search Tree
/// </summary>
public class BSTree {

    public int value;
    /// <summary>
    /// max
    /// </summary>
    public BSTree left;
    /// <summary>
    /// min
    /// </summary>
    public BSTree right;
    /// <summary>
    /// top
    /// </summary>
    public BSTree parent;

    public BSTree(int value) {
        this.value = value;
    }

    public static BSTree BuildBST(List<int> iSet) {
        BSTree tree = new BSTree(iSet[0]);
        for(int i = 1; i < iSet.Count; i++) {
            tree.Append(iSet[i]);
        }
        return tree;
    }

    /// <summary>
    /// 向BSTree添加一個節(jié)點
    /// </summary>
    /// <param name="v"></param>
    /// <returns></returns>
    public BSTree Append(int v) {
        BSTree t = this,parent=null;
        bool left = false;
        //循環(huán)出一個適合的空位置t
        while (t != null) { 
            parent = t;
            if (t.value == v)   //若包含此元素則不添加
                return this;
            if (t.value > v) {  
                t = t.right;
                left = false;
            } else {
                t = t.left;
                left = true;
            }
        }
        t = new BSTree(v);
        t.parent = parent;
        if (left) parent.left = t; else parent.right = t;
        return t;
    }

    /// <summary>
    /// 遍歷方法的迭代版本
    /// </summary>
    /// <returns></returns>
    public List<int> ToList() {
        List<int> result = new List<int>();
        BSTree tree = this;
        while (!(tree == this && result.Contains(tree.value))) {   //當(dāng)指針回到根節(jié)點并且已經(jīng)被取過時結(jié)束
            if(tree.left == null || result.Contains(tree.left.value)) {    //若左方向為空或已被包含轴总,則當(dāng)前位為最位(左直颅,右)
                if(!result.Contains(tree.value))
                    result.Add(tree.value);
                if(tree.right !=null && !result.Contains(tree.right.value)) {   //若右方向(同上),并向右移動
                    tree = tree.right;  //移位
                    continue;
                } else {    //往上方向移動
                    tree = tree.parent;
                }
            } else if(tree.left != null) {    //向左方向移動
                tree = tree.left;
            }
        }
        return result;
       }

    /// <summary>
    /// 遍歷方法的遞歸方式
    /// </summary>
    /// <returns></returns>
    public List<int> ToList_Recursion() {
        List<int> result = new List<int>();
        if(this.left != null) {
            result.AddRange(this.left.ToList_Recursion());
        }
        result.Add(this.value);
        if (this.right != null) {
            result.AddRange(this.right.ToList_Recursion());
        }
        return result;
    }

    /// <summary>
    /// 重寫object類的ToString方法
    /// </summary>
    /// <returns></returns>
    public override string ToString() {
        var list = ToList_Recursion();
        StringBuilder sb = new StringBuilder();
        foreach (var i in list) sb.Append(i.ToString() + " ");
        return sb.ToString();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怀樟,隨后出現(xiàn)的幾起案子功偿,更是在濱河造成了極大的恐慌,老刑警劉巖往堡,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件械荷,死亡現(xiàn)場離奇詭異共耍,居然都是意外死亡,警方通過查閱死者的電腦和手機吨瞎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門征堪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人关拒,你說我怎么就攤上這事∮褂椋” “怎么了着绊?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長熟尉。 經(jīng)常有香客問我归露,道長,這世上最難降的妖魔是什么斤儿? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任剧包,我火速辦了婚禮,結(jié)果婚禮上往果,老公的妹妹穿的比我還像新娘疆液。我一直安慰自己,他們只是感情好陕贮,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布堕油。 她就那樣靜靜地躺著,像睡著了一般肮之。 火紅的嫁衣襯著肌膚如雪掉缺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天戈擒,我揣著相機與錄音眶明,去河邊找鬼。 笑死筐高,一個胖子當(dāng)著我的面吹牛搜囱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凯傲,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼犬辰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冰单?” 一聲冷哼從身側(cè)響起幌缝,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎诫欠,沒想到半個月后涵卵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浴栽,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年轿偎,在試婚紗的時候發(fā)現(xiàn)自己被綠了典鸡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡坏晦,死狀恐怖萝玷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昆婿,我是刑警寧澤球碉,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站仓蛆,受9級特大地震影響睁冬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜看疙,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一豆拨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧能庆,春花似錦施禾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丰涉,卻和暖如春拓巧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背一死。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工肛度, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人投慈。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓承耿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伪煤。 傳聞我的和親對象是個殘疾皇子加袋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

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

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹與前面介紹的線性表抱既,棧职烧,隊列等線性結(jié)構(gòu)不同,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,452評論 1 31
  • 寫在前面 最近在leetcode上做了一些關(guān)于二叉搜索樹(BST)的題目,仔細(xì)看了下關(guān)于BST的資料蚀之,這兒自己做一...
    cutoutsy閱讀 836評論 0 1
  • 0. 什么是樹 數(shù)據(jù)的基本單位是數(shù)據(jù)元素蝗敢,在涉及到數(shù)據(jù)處理時數(shù)據(jù)元素之間的關(guān)系稱之為結(jié)構(gòu),我們依據(jù)數(shù)據(jù)元素之間關(guān)系...
    安安zoe閱讀 486評論 0 0
  • 目錄 0.樹0.1 一般樹的定義0.2 二叉樹的定義 1.查找樹ADT 2.查找樹的實現(xiàn)2.1 二叉查找樹2.2 ...
    王偵閱讀 7,199評論 0 3
  • 名稱解釋: B-Tree :樹 Leaf : 樹葉 : 樹葉 葉子節(jié)點/終端節(jié)點 : 沒有子節(jié)點的節(jié)點,記為樹葉 ...
    北風(fēng)第一支閱讀 355評論 0 0