2019-04-03

Javascript編程訓練


一彬向、前言

本篇開發(fā)環(huán)境

1兼贡、操作系統(tǒng): windows 10 x64
2、編輯器:VS Code

實驗目的

熟悉JavaScript語法


二娃胆、實驗準備

查看JavaScript教程:
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000
安裝和運行:http://nodejs.cn/ 下載node.js


三遍希、實驗內容

制作一個二叉樹Tree,實現(xiàn)樹節(jié)點的插入里烦,刪除凿蒜,前序遍歷等操作汪疮。同時把該數(shù)據(jù)保存為json格式的文件盾似;并能從文件讀取到內存中疼约;

可以基于其他語言的代碼進行修改寸五;但盡量采用面向對象的編程方法。


四靖避、實驗步驟

1.首先我們建立一個二叉查找樹(二叉排序樹),從開始節(jié)點作為根節(jié)點,對其遍歷插入触趴,具體代碼如下:

function BinaryTree(){
    var Node = function(key) {
    this.key = key;
    this.left = null;
    this.right = null; 
    };
 
    var root = null;
 
    var insertNode = function(node, newNode){
        if(newNode.key<node.key){
            if(node.left === null){
                node.left = newNode;
            } else {
                insertNode(node.left, newNode);
            }
        } else {
            if(node.right === null){
                node.right = newNode;
            } else {
                insertNode(node.right, newNode);
            } 
        }
    }
 
    this.insert = function(key) {
         var newNode = new Node(key);
         if (root === null){
        root = newNode;
            } else {
        insertNode(root,newNode);
        }
    };
}

2.實現(xiàn)二叉排序樹的前序遍歷,在function里面加入以下程序:

var preOrderTraverseNode = function(node,callback)
    {
        if(node != null)
        {
            callback(node.key);
            preOrderTraverseNode(node.left,callback);
            preOrderTraverseNode(node.right,callback);
        }
    }

    this.preOrderTraverse = function(callback)
    {
        preOrderTraverseNode(root,callback);
    }

3.實現(xiàn)刪除值為x的結點

注:二叉樹中刪除節(jié)點有三種情況
1渴肉、葉結點
2冗懦、有一個子節(jié)點的結點
3、有兩個孩子的結點(需要用到下面的minNode方法)仇祭。

    var minNode = function(node)
    {
        while(node && node.left !== null)
        {
            node=node.left;
        }
        return node.key;
    }
 
    this.min = function()
    {
        return minNode(root);
    }

    var removeNode = function(node, key)
    {
        if(node === null)
        {
            return null;
        }
        if(node.key > key)
        {
            node.left = removeNode(node.left,key);
            return node;
        }
        else if(node.key < key)
        {
            node.right = removeNode(node.right,key);
        }
        else
        {
            if(node.left === null && node.right==null)
            {
                node = null;
                return node;
            }
            if(node.right === null)
            {
                node = node.right;
                return node;
            }
            else if(node.left === null)
            {
                node = node.left;
                return node;
            }
            var minNode = minNode(node.right);
            node.key = minNode.key;
            node.right = removeNode(node.right,key);
            return node;
        }
    }

    this.remove = function(key)
    {
        return removeNode(root,key);
    }

4.將二叉樹的數(shù)據(jù)寫入到json文件里披蕉,再用js讀取它到內存中

json文件:

{
    "MyTree":[1,3,7,2,4,8,5]
}

js代碼:

var tree = null;
var fs=require('fs');
var mJSON = JSON.parse(fs.readFileSync("2.3.json"));//打開json文件,將內容以json數(shù)據(jù)格式賦給mJSON
tree = mJSON.MyTree;//將json文件中的數(shù)組賦給tree

以上兩塊相加效果等同于

var tree = [1,3,7,2,4,8,5];

5.全部代碼

json:

{
    "MyTree":[1,3,7,2,4,8,5]
}

javascript:

function BinaryTree()
{
    var Node = function(key) {
    this.key = key;
    this.left = null;
    this.right = null; 
    };
 
    var root = null;
 
    var insertNode = function(node, newNode)
    {
        if(newNode.key<node.key)//排序樹插入方法
        {
            if(node.left === null) node.left = newNode;
            else insertNode(node.left, newNode);
        }
        else 
        {
            if(node.right === null)node.right = newNode;
            else insertNode(node.right, newNode);
        }
    }
    
    this.insert = function(key) 
    {
        var newNode = new Node(key);
        if (root === null)root = newNode;
        else insertNode(root,newNode);
    };

    var minNode = function(node)
    {
        while(node && node.left !== null)
        {
            node=node.left;
        }
        return node.key;
    }
 
    this.min = function()
    {
        return minNode(root);
    }

    var removeNode = function(node, key)
    {
        if(node === null)
        {
            return null;
        }
        if(node.key > key)
        {
            node.left = removeNode(node.left,key);
            return node;
        }
        else if(node.key < key)
        {
            node.right = removeNode(node.right,key);
        }
        else
        {
            if(node.left === null && node.right==null)
            {
                node = null;
                return node;
            }
            if(node.right === null)
            {
                node = node.right;
                return node;
            }
            else if(node.left === null)
            {
                node = node.left;
                return node;
            }
            var minNode = minNode(node.right);
            node.key = minNode.key;
            node.right = removeNode(node.right,key);
            return node;
        }
    }

    this.remove = function(key)
    {
        return removeNode(root,key);
    }

    var preOrderTraverseNode = function(node,callback)
    {
        if(node != null)
        {
            callback(node.key);
            preOrderTraverseNode(node.left,callback);
            preOrderTraverseNode(node.right,callback);
        }
    }

    this.preOrderTraverse = function(callback)
    {
        preOrderTraverseNode(root,callback);
    }
}

var tree = null;
var fs=require('fs');
var mJSON = JSON.parse(fs.readFileSync("2.3.json"));//打開json文件乌奇,將內容以json數(shù)據(jù)格式賦給mJSON
tree = mJSON.MyTree;//將json文件中的數(shù)組賦給tree

var binaryTree = new BinaryTree();
tree.forEach(function(key){binaryTree.insert(key);});//插入tree數(shù)組中的數(shù)據(jù)
var callback = function(key){console.log(key);}
console.log("PreorderTraverse:");
binaryTree.preOrderTraverse(callback);
console.log("Remove Node 2");
binaryTree.remove(2);
console.log("PreorderTraverse:");
binaryTree.preOrderTraverse(callback);
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末没讲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子礁苗,更是在濱河造成了極大的恐慌爬凑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件试伙,死亡現(xiàn)場離奇詭異嘁信,居然都是意外死亡,警方通過查閱死者的電腦和手機疏叨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門潘靖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚤蔓,你說我怎么就攤上這事卦溢。” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵既绕,是天一觀的道長啄刹。 經(jīng)常有香客問我,道長凄贩,這世上最難降的妖魔是什么誓军? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮疲扎,結果婚禮上昵时,老公的妹妹穿的比我還像新娘。我一直安慰自己椒丧,他們只是感情好壹甥,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著壶熏,像睡著了一般句柠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棒假,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天溯职,我揣著相機與錄音,去河邊找鬼帽哑。 笑死谜酒,一個胖子當著我的面吹牛,可吹牛的內容都是我干的妻枕。 我是一名探鬼主播僻族,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屡谐!你這毒婦竟也來了述么?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤愕掏,失蹤者是張志新(化名)和其女友劉穎碉输,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亭珍,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡敷钾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肄梨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阻荒。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖众羡,靈堂內的尸體忽然破棺而出侨赡,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布羊壹,位于F島的核電站蓖宦,受9級特大地震影響,放射性物質發(fā)生泄漏油猫。R本人自食惡果不足惜稠茂,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望情妖。 院中可真熱鬧睬关,春花似錦、人聲如沸毡证。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽料睛。三九已至丐箩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恤煞,已是汗流浹背屎勘。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阱州,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓法梯,卻偏偏與公主長得像苔货,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子立哑,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內容

  • 一些概念 數(shù)據(jù)結構就是研究數(shù)據(jù)的邏輯結構和物理結構以及它們之間相互關系夜惭,并對這種結構定義相應的運算,而且確保經(jīng)過這...
    Winterfell_Z閱讀 5,811評論 0 13
  • 樹的簡介 棧铛绰、隊列诈茧、鏈表等數(shù)據(jù)結構,都是順序數(shù)據(jù)結構捂掰。而樹是非順序數(shù)據(jù)結構敢会。樹型結構是一類非常重要的非線性結構。直...
    黎貝卡beka閱讀 15,631評論 4 25
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結點至多有m個孩子这嚣。 除根結點和葉子結點外鸥昏,其它每個結點至少有m...
    文檔隨手記閱讀 13,222評論 0 25
  • 2018.5.23 文/琴音 1 這樣的場景我們都不陌生。 飯桌上姐帚,孩子的碗周圍撒了...
    王燕惠閱讀 221評論 0 2
  • 最近有點累了吏垮,快一年的時間每天來回100多公里的交通讓我很累;每天不能從技術層面上公司人溝通反而勾心斗角很累;每天...
    營長Fritz閱讀 628評論 0 6