婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 算法系列15天速成 第六天 五大經(jīng)典查找【下】

算法系列15天速成 第六天 五大經(jīng)典查找【下】

熱門標簽:地圖標注和圖片標注 電銷機器人怎么收費 湖北穩(wěn)定外呼系統(tǒng) 嘟聲的電銷機器人 滄州智能外呼系統(tǒng)收費 語音平臺系統(tǒng) 洛陽便宜外呼系統(tǒng)廠家 醫(yī)院地圖標注 忻州外呼系統(tǒng)接口對接
大家是否感覺到,樹在數(shù)據(jù)結構中大行其道,什么領域都要沾一沾,碰一碰。
就拿我們前幾天學過的排序就用到了堆和今天講的”二叉排序樹“,所以偏激的說,掌握的樹你就是牛人了。

今天就聊聊這個”五大經(jīng)典查找“中的最后一個”二叉排序樹“。

1. 概念:
     1> 其實很簡單,若根節(jié)點有左子樹,則左子樹的所有節(jié)點都比根節(jié)點小。
                             若根節(jié)點有右子樹,則右子樹的所有節(jié)點都比根節(jié)點大。
     2> 如圖就是一個”二叉排序樹“,然后對照概念一比較比較。

         

2.實際操作:

    我們都知道,對一個東西進行操作,無非就是增刪查改,接下來我們就聊聊其中的基本操作。

    1> 插入:相信大家對“排序樹”的概念都清楚了吧,那么插入的原理就很簡單了。

                    比如說我們插入一個20到這棵樹中。

                                 首先:20跟50比,發(fā)現(xiàn)20是老小,不得已,得要歸結到50的左子樹中去比較。

                                 然后:20跟30比,發(fā)現(xiàn)20還是老小。

                              再然后:20跟10比,發(fā)現(xiàn)自己是老大,隨即插入到10的右子樹中。

                                 最后: 效果呈現(xiàn)圖如下:

               

               

    2>查找:相信懂得了插入,查找就跟容易理解了。

                    就拿上面一幅圖來說,比如我想找到節(jié)點10.

                                     首先:10跟50比,發(fā)現(xiàn)10是老小,則在50的左子樹中找。

                                     然后:10跟30比,發(fā)現(xiàn)還是老小,則在30的左子樹中找。

                                  再然后:  10跟10比,發(fā)現(xiàn)一樣,然后就返回找到的信號。

                

     3>刪除:刪除節(jié)點在樹中還是比較麻煩的,主要有三種情況。

                   《1》 刪除的是“葉節(jié)點20“,這種情況還是比較簡單的,刪除20不會破壞樹的結構。如圖:

                    

                      

                   《2》刪除”單孩子節(jié)點90“,這個情況相比第一種要麻煩一點點,需要把他的孩子頂上去。

                    

                       

                   《3》刪除“左右孩子都有的節(jié)點50”,這個讓我在代碼編寫上糾結了好長時間,問題很直白,

                           我把50刪掉了,誰頂上去了問題,是左孩子呢?還是右孩子呢?還是另有蹊蹺?這里我就

                           坦白吧,不知道大家可否知道“二叉樹”的中序遍歷,不過這個我會在后面講的,現(xiàn)在可以當

                          公式記住吧,就是找到右節(jié)點的左子樹最左孩子。

                          比如:首先 找到50的右孩子70。

                                  然后  找到70的最左孩子,發(fā)現(xiàn)沒有,則返回自己。

                                  最后  原始圖和最終圖如下。 

  

 

3.說了這么多,上代碼說話。

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace TreeSearch
{
    class Program
    {
        static void Main(string[] args)
        {
            Listint> list = new Listint>() { 50, 30, 70, 10, 40, 90, 80 };

            //創(chuàng)建二叉遍歷樹
            BSTree bsTree = CreateBST(list);

            Console.Write("中序遍歷的原始數(shù)據(jù):");

            //中序遍歷
            LDR_BST(bsTree);

            Console.WriteLine("\n---------------------------------------------------------------------------n");

            //查找一個節(jié)點
            Console.WriteLine("\n10在二叉樹中是否包含:" + SearchBST(bsTree, 10));

            Console.WriteLine("\n---------------------------------------------------------------------------n");

            bool isExcute = false;

            //插入一個節(jié)點
            InsertBST(bsTree, 20, ref isExcute);

            Console.WriteLine("\n20插入到二叉樹,中序遍歷后:");

            //中序遍歷
            LDR_BST(bsTree);

            Console.WriteLine("\n---------------------------------------------------------------------------n");

            Console.Write("刪除葉子節(jié)點 20, \n中序遍歷后:");

            //刪除一個節(jié)點(葉子節(jié)點)
            DeleteBST(ref bsTree, 20);

            //再次中序遍歷
            LDR_BST(bsTree);

            Console.WriteLine("\n****************************************************************************\n");

            Console.WriteLine("刪除單孩子節(jié)點 90, \n中序遍歷后:");

            //刪除單孩子節(jié)點
            DeleteBST(ref bsTree, 90);

            //再次中序遍歷
            LDR_BST(bsTree);

            Console.WriteLine("\n****************************************************************************\n");

            Console.WriteLine("刪除根節(jié)點 50, \n中序遍歷后:");
            //刪除根節(jié)點
            DeleteBST(ref bsTree, 50);

            LDR_BST(bsTree);

        }

        ///summary>
/// 定義一個二叉排序樹結構
////summary>
        public class BSTree
        {
            public int data;
            public BSTree left;
            public BSTree right;
        }

        ///summary>
/// 二叉排序樹的插入操作
////summary>
///param name="bsTree">排序樹/param>
///param name="key">插入數(shù)/param>
///param name="isExcute">是否執(zhí)行了if語句/param>
        static void InsertBST(BSTree bsTree, int key, ref bool isExcute)
        {
            if (bsTree == null)
                return;

            //如果父節(jié)點大于key,則遍歷左子樹
            if (bsTree.data > key)
                InsertBST(bsTree.left, key, ref isExcute);
            else
                InsertBST(bsTree.right, key, ref isExcute);

            if (!isExcute)
            {
                //構建當前節(jié)點
                BSTree current = new BSTree()
                  {
                      data = key,
                      left = null,
                      right = null
                  };

                //插入到父節(jié)點的當前元素
                if (bsTree.data > key)
                    bsTree.left = current;
                else
                    bsTree.right = current;

                isExcute = true;
            }

        }

        ///summary>
/// 創(chuàng)建二叉排序樹
////summary>
///param name="list">/param>
        static BSTree CreateBST(Listint> list)
        {
            //構建BST中的根節(jié)點
            BSTree bsTree = new BSTree()
            {
                data = list[0],
                left = null,
                right = null
            };

            for (int i = 1; i list.Count; i++)
            {
                bool isExcute = false;
                InsertBST(bsTree, list[i], ref isExcute);
            }
            return bsTree;
        }

        ///summary>
/// 在排序二叉樹中搜索指定節(jié)點
////summary>
///param name="bsTree">/param>
///param name="key">/param>
///returns>/returns>
        static bool SearchBST(BSTree bsTree, int key)
        {
            //如果bsTree為空,說明已經(jīng)遍歷到頭了
            if (bsTree == null)
                return false;

            if (bsTree.data == key)
                return true;

            if (bsTree.data > key)
                return SearchBST(bsTree.left, key);
            else
                return SearchBST(bsTree.right, key);
        }

        ///summary>
/// 中序遍歷二叉排序樹
////summary>
///param name="bsTree">/param>
///returns>/returns>
        static void LDR_BST(BSTree bsTree)
        {
            if (bsTree != null)
            {
                //遍歷左子樹
                LDR_BST(bsTree.left);

                //輸入節(jié)點數(shù)據(jù)
                Console.Write(bsTree.data + "");

                //遍歷右子樹
                LDR_BST(bsTree.right);
            }
        }

        ///summary>
/// 刪除二叉排序樹中指定key節(jié)點
////summary>
///param name="bsTree">/param>
///param name="key">/param>
        static void DeleteBST(ref BSTree bsTree, int key)
        {
            if (bsTree == null)
                return;

            if (bsTree.data == key)
            {
                //第一種情況:葉子節(jié)點
                if (bsTree.left == null bsTree.right == null)
                {
                    bsTree = null;
                    return;
                }
                //第二種情況:左子樹不為空
                if (bsTree.left != null bsTree.right == null)
                {
                    bsTree = bsTree.left;
                    return;
                }
                //第三種情況,右子樹不為空
                if (bsTree.left == null bsTree.right != null)
                {
                    bsTree = bsTree.right;
                    return;
                }
                //第四種情況,左右子樹都不為空
                if (bsTree.left != null bsTree.right != null)
                {
                    var node = bsTree.right;

                    //找到右子樹中的最左節(jié)點
                    while (node.left != null)
                    {
                        //遍歷它的左子樹
                        node = node.left;
                    }

                    //交換左右孩子
                    node.left = bsTree.left;

                    //判斷是真正的葉子節(jié)點還是空左孩子的父節(jié)點
                    if (node.right == null)
                    {
                        //刪除掉右子樹最左節(jié)點
                        DeleteBST(ref bsTree, node.data);

                        node.right = bsTree.right;
                    }
                    //重新賦值一下
                    bsTree = node;

                }
            }

            if (bsTree.data > key)
            {
                DeleteBST(ref bsTree.left, key);
            }
            else
            {
                DeleteBST(ref bsTree.right, key);
            }
        }
    }
}

運行結果:

值的注意的是:二叉排序樹同樣采用“空間換時間”的做法。

突然發(fā)現(xiàn),二叉排序樹的中序遍歷同樣可以排序數(shù)組,呵呵,不錯!

PS:  插入操作:O(LogN)。
       刪除操作:O(LogN)。
       查找操作:O(LogN)。

您可能感興趣的文章:
  • 算法系列15天速成 第十四天 圖【上】
  • 算法系列15天速成——第十三天 樹操作【下】
  • 算法系列15天速成 第十二天 樹操作【中】
  • 算法系列15天速成 第十一天 樹操作(上)
  • 算法系列15天速成 第十天 棧
  • 算法系列15天速成 第八天 線性表【下】
  • 算法系列15天速成 第九天 隊列
  • 算法系列15天速成 第七天 線性表【上】
  • 算法系列15天速成 第五天 五大經(jīng)典查找【中】
  • 算法系列15天速成 第四天 五大經(jīng)典查找【上】
  • 算法系列15天速成 第三天 七大經(jīng)典排序【下】
  • 算法系列15天速成 第二天 七大經(jīng)典排序【中】
  • 算法系列15天速成 第一天 七大經(jīng)典排序【上】
  • 算法系列15天速成——第十五天 圖【下】(大結局)

標簽:巴彥淖爾 定州 山南 96 內蒙古 防城港 日照 宜賓

巨人網(wǎng)絡通訊聲明:本文標題《算法系列15天速成 第六天 五大經(jīng)典查找【下】》,本文關鍵詞  算法,系列,15天,速成,第六,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《算法系列15天速成 第六天 五大經(jīng)典查找【下】》相關的同類信息!
  • 本頁收集關于算法系列15天速成 第六天 五大經(jīng)典查找【下】的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲一本大道在线| 99国产精品一区| 欧美一区二视频| 日韩精品五月天| 欧美精品一区二区精品网| hitomi一区二区三区精品| 亚洲韩国一区二区三区| 中文字幕免费不卡在线| 欧美视频精品在线观看| av不卡在线播放| 成人性生交大片免费看视频在线| 亚洲一区在线视频观看| 国产日韩精品视频一区| 国产成人精品免费网站| 国产资源精品在线观看| 亚洲最色的网站| 亚洲欧美偷拍另类a∨色屁股| 26uuu国产日韩综合| 日韩欧美成人午夜| 欧美va在线播放| 久久久国产午夜精品| 日韩精品电影在线观看| 亚洲国产精品欧美一二99| 一区二区免费视频| 日韩av一区二区在线影视| 亚洲成人av电影| 美脚の诱脚舐め脚责91 | 国产在线精品一区二区夜色| 久久精品国产99国产| 青娱乐精品在线视频| 精品一区精品二区高清| 成人午夜大片免费观看| 欧美无乱码久久久免费午夜一区| 一本大道久久a久久精品综合| 成人性生交大合| 欧美四级电影网| 国产亚洲欧美在线| 亚洲视频一二区| 国产乱对白刺激视频不卡| 99re成人在线| 久久麻豆一区二区| 亚洲一区在线观看网站| 欧美a一区二区| 97se亚洲国产综合自在线不卡 | 视频一区在线视频| 国产精品一区二区久久不卡 | 色噜噜偷拍精品综合在线| 欧美区视频在线观看| 国产在线一区二区| 国产精品午夜在线观看| 成人av在线网| 亚洲第一福利视频在线| 国产精品免费观看视频| 亚洲精品免费视频| 91视视频在线观看入口直接观看www| 成人高清免费在线播放| 欧美一级电影网站| 一区二区在线观看视频在线观看| 国产精品亚洲视频| 99国产一区二区三精品乱码| 日韩欧美一区在线| 国产午夜精品一区二区三区四区| 91 com成人网| 日本女人一区二区三区| 欧美一区二区成人| 亚洲成av人影院在线观看网| 欧美日韩国产色站一区二区三区| 一区二区在线观看免费视频播放| 91色在线porny| 图片区小说区国产精品视频| 欧美嫩在线观看| 久久草av在线| 中文字幕五月欧美| 在线观看国产一区二区| 天天综合色天天综合| 99r国产精品| 日韩高清国产一区在线| 久久综合九色综合欧美亚洲| 91在线云播放| 韩国成人精品a∨在线观看| 国产精品福利一区| 日韩欧美激情四射| 91久久一区二区| 波多野结衣中文字幕一区 | 日韩一区二区三区免费观看| 日韩电影一二三区| 亚洲欧洲精品一区二区三区 | 国产日韩一级二级三级| 欧美性猛交xxxx黑人交| 成人av在线一区二区| 久久99久久精品欧美| 日韩欧美国产高清| 欧美精品久久久久久久久老牛影院 | 国产露脸91国语对白| 天涯成人国产亚洲精品一区av| 欧美激情一区二区三区四区 | 中文字幕亚洲一区二区va在线| 色综合久久综合| av一区二区不卡| 成人高清免费在线播放| 成人久久久精品乱码一区二区三区| 一区二区三区四区精品在线视频| 欧美色综合影院| 日韩一区二区三区免费观看| 中文字幕一区在线观看视频| 久久国产乱子精品免费女| 国产亚洲综合在线| 国产亚洲欧美日韩日本| 亚洲色图制服诱惑| 日日摸夜夜添夜夜添精品视频| 亚洲电影中文字幕在线观看| 免费在线观看日韩欧美| 国产综合久久久久影院| 99精品偷自拍| 久久人人97超碰com| 中文字幕在线视频一区| 亚洲一区二区视频在线| 国内精品伊人久久久久影院对白| 成人毛片在线观看| 日韩精品自拍偷拍| 亚洲国产精品久久人人爱蜜臀| 青青草原综合久久大伊人精品优势| 精品一区二区在线免费观看| 欧美色图天堂网| 国产精品不卡视频| 国产最新精品精品你懂的| 欧美精品成人一区二区三区四区| 亚洲视频一区在线| 国产精品中文字幕欧美| 精品剧情在线观看| 国产成人av一区二区三区在线 | 久久日一线二线三线suv| 国产麻豆精品视频| 亚洲午夜av在线| 亚洲免费观看高清完整版在线 | 久久精品免视看| 99久久免费视频.com| 国产一区二区91| 99久久精品久久久久久清纯| av成人老司机| av中文字幕在线不卡| av不卡在线播放| 白白色 亚洲乱淫| 欧美一区二区视频在线观看 | 欧美日韩一级大片网址| 亚洲视频一二区| 国产伦精品一区二区三区视频青涩| 亚洲美女精品一区| 国产福利91精品一区二区三区| 欧美顶级少妇做爰| 美女诱惑一区二区| 91视频www| 88在线观看91蜜桃国自产| 亚洲男人的天堂av| 欧美色欧美亚洲另类二区| 午夜精品免费在线| 日韩欧美一二三区| www.亚洲精品| 亚洲成精国产精品女| 欧美成人性福生活免费看| 99久久精品一区| av成人老司机| 亚洲成人免费影院| 亚洲日本丝袜连裤袜办公室| 欧美精品一区二区在线播放| 日韩你懂的在线观看| 成人高清在线视频| 一本一道久久a久久精品综合蜜臀| 日本美女一区二区三区| 久久av中文字幕片| 亚洲国产视频网站| 一区二区三区中文字幕在线观看| 国产精品美女一区二区三区| 国产日产欧美一区二区视频| 欧美zozozo| 国产精品视频九色porn| 国产精品久久久久久亚洲毛片| 91精品在线免费观看| 成人午夜视频在线| 久久99精品久久久| 91视频免费播放| 风间由美一区二区av101| 成人av网站在线观看免费| 94色蜜桃网一区二区三区| 在线观看免费成人| 在线观看欧美精品| 日韩女优毛片在线| 亚洲欧洲国产日韩| 亚洲国产精品久久一线不卡| 亚洲成人福利片| 亚洲日本va午夜在线影院| 亚洲成人资源网| 国产精品一二三四| 国产成a人无v码亚洲福利| 在线观看国产91| 91精品免费在线| 亚洲精品v日韩精品| 日韩电影在线免费观看| av在线播放不卡| 久久蜜桃av一区精品变态类天堂|