【經典回放】多種語言系列數據結構算法:二叉樹(JavaScript版)

1 二叉樹類的設計以及二叉樹遍歷

要完成二叉樹的類設計,最好把鏈表下的Node.js復制過來,相比鏈表的結點,二叉樹僅僅是多了一個結點指針而已。略加修改后,就是:

function TNODE(DATA)
{
this.Data=DATA;
this.lChild=null;
this.rChild=null;
this.SetLChild=function (LCHILD){this.lChild=LCHILD;}
this.GetLChild=function (){return this.lChild;}
this.SetRChild=function (RCHILD){this.rChild=RCHILD;}
this.GetRChild=function (){return this.rChild;}
this.GetData=function (){return this.Data;}
}

在這個類中,用:

SetLChild()、GetLChild()? 兩個方法來設置、讀出該結點的左孩子;

SetRChild()、GetRChild()? 兩個方法來設置、讀出該結點的右孩子;

SetData()、GetData()???? 兩個方法來設置、讀出該結點的數值。

要測試這個類,也很容易,注意再次復制二叉樹下的a1.html,略加修改就是:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>二叉樹測試程序</title><SCRIPT TYPE="TEXT/JAVASCRIPT" src="TNode0.js"></SCRIPT><script type="text/javascript">function Trav(T){var s;if(T==undefined||T==null) return;Trav(T.GetLChild());document.write(T.GetData()+'<br>');Trav(T.GetRChild());}function fun(){var A='AA';var B='BB';var C='CC';var D='DD';var TA=new TNODE(A);var TB=new TNODE(B);var TC=new TNODE(C);var TD=new TNODE(D);TA.SetLChild(TB);TA.SetRChild(TC);TB.SetRChild(TD);		Trav(TA);}</script></head><body bgcolor="#FFFFFF"><div><input type="button" id=BUTTON1 value="開始測試" onclick='fun()'/></div></body>
</html>

注意這個程序的第5行,一定要加載TNode0.js,否則無法構造二叉樹。

第7到14行是一個典型的遞歸二叉樹遍歷,其中第12行打印遍歷結果的語句,說明它是按中序遍歷打印結果的。

第15開始的函數fun(),是構造一個簡單的二叉樹,然后在第27行進行遍歷。

從程序本身而言,沒有任何復雜的地方,直接點開T1.html就顯示了結果。

2 IE8JavaScript程序的調試

JavaScript編程,最大的麻煩是缺乏一個好的編程平臺,往往這類簡單的程序,都是在記事本這樣的程序里編寫的,但必要的調試手段還是需要的。目前,很多瀏覽器都自己帶有JavaScrip程序調試工具,比較常用的有兩種:IE8、Chrome兩種瀏覽器。IE8是WINDOWS系統默認的瀏覽器,而谷歌的Chrome則非常小,并且功能異常強大,我們下面先看在IE8下如何調試JvaaScrip程序。

用IE8打開T1.HTML文件,然后點開菜單:工具->開發人員工具,就是:

圖 1

則顯示下面的界面:

圖 2

注意按下選項卡:腳本,如圖3就會看到我們的程序。

?

圖 3

注意看上面的按鈕:啟動調試,鼠標按下該按鈕。然后看左邊程序行號,選第17行的“17”位置處、鼠標點下,就是這樣的結果:

圖 4

這個功能是給該行上加上斷點,所謂斷點就是程序運行到這里要停止下來,做完這些工作后,回到瀏覽器界面里,按下網頁上按鈕:開始測試,讓程序開始運行,此時程序會跳到上述加斷點的位置處、并停下來,就是:

圖 5

注意此時的界面,它分割成兩個部分,按下右邊界面的按鈕:局部變量,有:

圖 6

如果按下F10、F11(含義同VC一致),會逐個語句執行并看到結果,如:

圖 7

從圖7我們可以看到這些變量的結果確實是我們所要的。按F11逐步進Trav()函數,就會看到這個樹的遍歷情況。

谷歌瀏覽器chrome的調試過程和IE8差別不大,僅僅是界面有差異,由于谷歌瀏覽器并沒有IE8瀏覽器的文件打開菜單,所以你可以用鼠標點中T1.HTML文件,直接拖進瀏覽器界面里即可,注意谷歌瀏覽器的調試功能是在:

圖 8

? 該功能隱藏很深,但功能確實不錯。值得注意的是谷歌瀏覽器支持HTML5,而IE8則不支持。

學會瀏覽器下調試JavaScript的另一個好處是:你可以直接對一個網站的程序進行這樣的調試,這在過去是不能想象的事情。由于有了這樣的功能,一度讓很多網站的安全防護遭到解破,但很快,相當數量的網站其安全體系也有了質的飛躍,所以一個工具本身的好壞是很難評價的,但總體說來:勤奮者手中有好的工具、那么好處是顯而易見的事情。

3 復雜數據類型對象的二叉樹構造以及遍歷

對JavaScrip這樣的計算機語言而言,它的變量本身沒有什么特定的類型概念,所以本身就是泛型的,但我們還是做一個結點數據類型復雜的二叉樹來完成一個實驗。

復制鏈表下的ElemType.js過來,這個類是:

function ElemType(SNO,SNAME,SAGE)
{this.sNo=SNO;this.sName=SNAME;this.sAge=SAGE;this.GetSNO=function(){return this.sNo;}this.GetSNAME=function(){return this.sName;}this.GetSAGE=function(){return this.sAge;}
}

這個類雖然簡單但也有合適的數據類型。為此,我們就要修改T1.html中結點的數據,就是這樣的:

?????????????????? var A=new ElemType(20102000,'A',19);

?????????????????? var B=new ElemType(20102001,'B',20);

?????????????????? var C=new ElemType(20102002,'C',21);

?????????????????? var D=new ElemType(20102003,'D',22);

然后和T1.HEML一樣,完成一個簡單的二叉樹,就是:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>二叉樹測試程序</title><SCRIPT TYPE="TEXT/JAVASCRIPT" src="ElemType.js"></SCRIPT><SCRIPT TYPE="TEXT/JAVASCRIPT" src="TNode0.js"></SCRIPT><script type="text/javascript">function Trav(T){var s;if(T==undefined||T==null) return;Trav(T.GetLChild());s=T.GetData();document.write(s.GetSNO()+'  '+s.GetSNAME()+'  '+s.GetSAGE()+'<br>');Trav(T.GetRChild());}function fun(){var A=new ElemType(20102000,'A',19);var B=new ElemType(20102001,'B',20);var C=new ElemType(20102002,'C',21);var D=new ElemType(20102003,'D',22);var TA=new TNODE(A);var TB=new TNODE(B);var TC=new TNODE(C);var TD=new TNODE(D);TA.SetLChild(TB);TA.SetRChild(TC);TB.SetRChild(TD);		Trav(TA);}</script></head><body bgcolor="#FFFFFF"><div><input type="button" id=BUTTON1 value="開始測試" onclick='fun()'/></div></body>
</html>

4 復雜數據類型的二叉樹遍歷,見T2.html

注意上面程序的變更:

第5行:要引用ElemType.js,否則我們沒辦法構造學生類型數據;

由于JavaScript的數據類型本身就是泛型,所以二叉樹類不需要任何修改。

第8行開始的遍歷函數Trav(),由于每個結點類型成為ElemType這樣的三列數據,所以要顯示一行就必須把三列分開顯示,如第14行。運行T2.html,會看到這個樹的遍歷結果。

4 回調模式傳輸遍歷結果

在C#下dt.c已經顯示了這個技術的全貌,這樣的遞歸函數就是這樣的;

function Trav(T,preTrav,inTrav,posTrav)
{if(T==undefined||T==null) return;if(!(preTrav==undefined||preTrav==null)) preTrav(T);Trav(T.GetLChild(),preTrav,inTrav,posTrav);if(!(inTrav==undefined||inTrav==null)) inTrav(T);Trav(T.GetRChild(),preTrav,inTrav,posTrav);if(!(posTrav==undefined||posTrav==null)) posTrav(T);
}

在這個函數里,參數:

T:????? 遍歷中二叉樹的結點對象;

preTrav:先序遍歷處理函數;

inTrav: 中序遍歷處理函數;

posTrav:后序遍歷處理函數;

把這個函數寫進二叉樹類中,全部就是:

function TNODE(DATA)
{
this.Data=DATA;
this.lChild=null;
this.rChild=null;
this.SetLChild=function (LCHILD){this.lChild=LCHILD;}
this.GetLChild=function (){return this.lChild;}
this.SetRChild=function (RCHILD){this.rChild=RCHILD;}
this.GetRChild=function (){return this.rChild;}
this.GetData=function (){return this.Data;}
function Trav(T,preTrav,inTrav,posTrav)
{if(T==undefined||T==null) return;if(!(preTrav==undefined||preTrav==null)) preTrav(T);Trav(T.GetLChild(),preTrav,inTrav,posTrav);if(!(inTrav==undefined||inTrav==null)) inTrav(T);Trav(T.GetRChild(),preTrav,inTrav,posTrav);if(!(posTrav==undefined||posTrav==null)) posTrav(T);
}
this.Traverse=function(preTrav,inTrav,posTrav){Trav(this,preTrav,inTrav,posTrav);}
}

注意這個類是在文件TNode1.js中。為了測試這個類,編寫網頁程序如下:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>二叉樹測試程序</title><SCRIPT TYPE="TEXT/JAVASCRIPT" src="TNode1.js"></SCRIPT><script type="text/javascript">function P1(T){document.write(T.GetData()+'<br>');}function fun(){var A='AA';var B='BB';var C='CC';var D='DD';var TA=new TNODE(A);var TB=new TNODE(B);var TC=new TNODE(C);var TD=new TNODE(D);TA.SetLChild(TB);TA.SetRChild(TC);TB.SetRChild(TD);		TA.Traverse(P1,null,null);}</script></head><body bgcolor="#FFFFFF"><div><input type="button" id=BUTTON1 value="開始測試" onclick='fun()'/></div></body>
</html>

注意第7行,這個函數P1()僅僅是打印結點的值,注意在第24行,TA結點的遍歷用P1作為實參傳遞給遍歷函數,這樣,這個網頁會打印出二叉樹的先序遍歷結果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287084.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287084.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287084.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Fiddler之解決https鏈接返回數據顯示亂碼問題

1 、問題 我網頁訪問淘寶&#xff0c;然后F12查看關鍵鏈接&#xff0c;返回的數據里面有json各式的數據&#xff0c;然后我通過關鍵字在Fiddler里面找到鏈接&#xff0c;然后查看返回的內容是亂碼。 2 、解決辦法 然后這樣設置&#xff0c;再去查看SyntaxView或者Raw都可以看到…

android上傳圖片被旋轉,input上傳照片旋轉解決辦法

需求很簡單&#xff1a;h5拍照上傳照片&#xff0c;然后顯示出來問題在&#xff1a;上傳之后的圖片在PC&#xff0c;IOS端均能正常顯示&#xff0c;Android端顯示的則是被旋轉90度的。直接上代碼下面這個方法傳入file對象&#xff0c;然后會去除掉照片中的exIf信息&#xff0c;…

(12)python 的列表我從沒想過會那么好用

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

如何優雅的跨 Namespace 同步 Secret 和 ConfigMap?

Secret 和 ConfigMap 資源對象是命名空間級別的。它們只能被同一命名空間中的 Pod 引用。所以有時候不得不手動為每個命名空間創建它們。但有很多場景&#xff0c;我們想讓它們是全局的&#xff0c;至少可以是跨命名空間共享的 Secret 和 ConfigMap&#xff0c;例如這些場景&am…

定量遙感:計算地方時和太陽高度角(C++代碼)

在定量遙感中,通常需要計算地方時和太陽高度角,本文采用C++語言實現。 #include <cmath> #include <iostream> #include <fstream> using namespace std; void main() {int JD,NF,Y,R,s[5],F[5];float JF,WD;float N0;ifstream data1("d:\\result\\da…

html5 語義化標簽

html5 語義化標簽 在HTML 5出來之前&#xff0c;我們用div來表示頁面章節&#xff0c;但是這些div都沒有實際意義。&#xff08;即使我們用css樣式的id和class形容這塊內容的意義&#xff09;。這些標簽只是我們提供給瀏覽器的指令&#xff0c;只是定義一個網頁的某些部分。但…

Android之實現首尾帶圓角的多顏色水平條

1 效果圖 3 代碼實現 這里我們采用PercentRelativeLayout布局,首尾我們用半圓shape實現,代碼如下 color.xml <color name="progress_first">#1ebBd5</color><color name="progress_second">#f36f53</color><color name=&…

setAutoCommit(false)導致讀不到數據

如果把Connection的AutoCommit設為False,兩次executeQuery之間&#xff0c;通過其它途徑&#xff08;我通過Navicat&#xff09;修改了status值為1&#xff0c;第二次executeQuery依然把那條數據讀出來了&#xff0c;也就是說&#xff0c;我在Navicat中的操作就像沒有發生一樣&…

log4j簡介及應用

一、介紹 Log4j是Apache的一個開放源代碼項目&#xff0c;通過使用Log4j&#xff0c;我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件、甚至是套接口服務 器、NT的事件記錄器、UNIX Syslog守護進程等&#xff1b;我們也可以控制每一條日志的輸出格式&#xff1b;通過…

(9)有一些人在學習編程的時候總以為代碼是死板的

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

GPS實驗一:GPS手持機的使用

一、實習目的 了解GPS手持機的使用 二、實習內容 了解GPS手持機的功能和相關操作 三、實習地點 選擇視野開闊的場所,方便接受衛星信號。 四、實習工具 GPS接收機是一款手持型的個人導航設備,它可以利用GPS衛星星座計算出當前的位置。其主要圖標有:OUT/IN(放大/縮小)、N…

.NET性能優化-推薦使用Collections.Pooled

簡介性能優化就是如何在保證處理相同數量的請求情況下占用更少的資源&#xff0c;而這個資源一般就是CPU或者內存&#xff0c;當然還有操作系統IO句柄、網絡流量、磁盤占用等等。但是絕大多數時候&#xff0c;我們就是在降低CPU和內存的占用率。之前分享的內容都有一些局限性&a…

Android之PC瀏覽器上傳表單格式大文件到手機客戶端read函數阻塞問題

1 、問題 PC瀏覽器上傳表單格式大文件到手機服務器端,然后read文件真實數據時候出現阻塞。 比如 User-Agent: PostmanRuntime/7.26.1Accept: */*Cache-Control: no-cachePostman-Token: c7e5e240-4398-4ac6-ba7f-98e99b5b4a01Host: 10.15.42.180:9999Accept-Encoding: gzip,…

避免活躍性危險(第十章)

2019獨角獸企業重金招聘Python工程師標準>>> 避免活躍性危險 在安全性與活躍性之間通常存在著某種制衡&#xff0c;我們使用加鎖機制來確保線程安全&#xff0c;但如果過度地使用加鎖&#xff0c;則可能導致“鎖順序死鎖”。同樣&#xff0c;我們使用線程池和信號量…

[poj2446]Chessboard

Description 給定一個mn的棋盤&#xff0c;上面有k個洞&#xff0c;求是否能在不重復覆蓋且不覆蓋到洞的情況下&#xff0c;用21的卡片完全覆蓋棋盤。 Input 第一行有三個整數n,m,k(0<m,n<32, 0<k<mn)&#xff0c;m表示行數&#xff0c;n表示列數。 接下來k行&…

Ubuntu下編譯內核

一、下載源代碼和編譯軟件的準備 下載內核源代碼&#xff1a;http://www.kernel.org/ 注意&#xff0c;點擊2.6.25內核的F版&#xff0c;即完整版。 如果你懶得去網站點聯接&#xff0c;運行下列命令&#xff1a; 代碼:$cd ~$ wget http://www.kernel.org/pub/linux/kernel/v2.…

(10)C#偷懶的開始永無止境的循環?

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

活照片 android,活照片app安卓

活照片app是當前國內一款最新的圖片處理應用軟件&#xff0c;能幫助大家快速進行最新的手機拍照、處理功能&#xff0c;當前活照片app已經推出了安卓、蘋果版本&#xff0c;可以幫助大家一鍵修圖&#xff0c;將你的圖片變得更加有趣。活照片app功能&#xff1a;它可以讓你的照片…

Jwt隱藏大坑,通過源碼揭秘

前言JWT是目前最為流行的接口認證方案之一&#xff0c;有關JWT協議的詳細內容&#xff0c;請參考&#xff1a;https://jwt.io/introduction今天分享一下在使用JWT在項目中遇到的一個問題&#xff0c;主要是一個協議的細節&#xff0c;非常容易被忽略&#xff0c;如果不是自己遇…

GPS實驗二:GPS接收機的使用

一、實習目的 1、了解GPS接收機的基本結構; 2、掌握GPS接收機的一般操作方法。 二、實習內容 1、了解GPS接收機的外觀及主要構成單元; 2、學習GPS接收機的安裝及靜態測量的操作方法; 3、了解GPS接收機工作時的基本狀態信息。 三、實習地點 選擇視野開闊的場所,視場…