本篇文章給大家介紹一下使用javascript實現(xiàn)二叉樹的創(chuàng)建和遍歷的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。
1、先說二叉樹的遍歷,遍歷方式:
前序遍歷:先遍歷根結(jié)點,然后左子樹,再右子樹
中序遍歷:先遍歷左子樹,然后根結(jié)點,再右子樹
后續(xù)遍歷:先遍歷左子樹,然后右子樹,再根結(jié)點
上代碼:主要還是利用遞歸
function treecode() { let bitree = function (ele) { this.data = ele; this.lchild = null; this.rchild = null; } this.createtree = function () { let bitree = new bitree('a'); bitree.lchild = new bitree('b'); bitree.rchild = new bitree('c'); bitree.lchild.lchild = new bitree('d'); bitree.lchild.lchild.lchild = new bitree('g'); bitree.lchild.lchild.rchild = new bitree('h'); bitree.rchild.lchild = new bitree('e'); bitree.rchild.rchild = new bitree('f'); bitree.rchild.lchild.rchild = new bitree('i'); return bitree; }}//前序遍歷function proordertraverse(bitree) { if (bitree == null) return; console.log(bitree.data); proordertraverse(bitree.lchild); proordertraverse(bitree.rchild);}//中序遍歷function inordertraverse(bitree) { if (bitree == null) return; inordertraverse(bitree.lchild); console.log(bitree.data); inordertraverse(bitree.rchild);}//后續(xù)遍歷function postordertraverse(bitree) { if (bitree == null) return; postordertraverse(bitree.lchild); postordertraverse(bitree.rchild); console.log(bitree.data);}let mytree = new treecode();console.log(mytree.createtree());console.log('前序遍歷')proordertraverse(mytree.createtree());console.log('中序遍歷')inordertraverse(mytree.createtree());console.log('后續(xù)遍歷')postordertraverse(mytree.createtree()); 二叉樹的非遞歸遍歷
深度優(yōu)先遍歷(主要利用棧的先進(jìn)后出)
廣度優(yōu)先遍歷(主要利用隊列的先進(jìn)先出)
//深度優(yōu)先非遞歸function depthfirstsearch(bitree) { let stack = []; stack.push(bitree); while (stack.length != 0) { let node = stack.pop(); console.log(node.data); if (node.rchild) { stack.push(node.rchild); } if (node.lchild) { stack.push(node.lchild); } }}//廣度優(yōu)先非遞歸function breadthfirstsearch(bitree) { let queue = []; queue.push(bitree); while (queue.length != 0) { let node = queue.shift(); console.log(node.data); if (node.lchild) { queue.push(node.lchild); } if (node.rchild) { queue.push(node.rchild); } }}深度優(yōu)先主要是利用棧,先壓右子樹,再壓左子樹
廣度優(yōu)先主要利用隊列,先入左子樹,再入右子樹
深度優(yōu)先的遍歷結(jié)果與前序遍歷相同abdghceif,廣度優(yōu)先的遍歷結(jié)果是 abcdefghi
2、創(chuàng)建二叉樹
1中創(chuàng)建二叉樹的方式過于笨拙,假入我們根據(jù)完全二叉樹的模型建立自己的二叉樹,空數(shù)據(jù)的地方用#表示,如下圖所示我們稱之為擴(kuò)展二叉樹,我們?nèi)∑淝靶虮闅v的序列 ab#d##c##。
上代碼:也是利用遞歸
//前序遍歷得到的字符串let strarr = 'ab#d##c##'.split('');function bitree(ele) { this.data = ele; this.lchild = null; this.rchild = null;}var newtree = new bitree('#');function createbitree(bitree) { if (strarr.length == 0) return; let str = strarr.shift(); if (str == '#') return; bitree.data = str; if (strarr[0] != '#') { bitree.lchild = new bitree('#') } createbitree(bitree.lchild); if (strarr[0] != '#') { bitree.rchild = new bitree('#') } createbitree(bitree.rchild);}createbitree(newtree);console.log(newtree);proordertraverse(newtree)你也可以用中序遍歷或者后序遍歷實現(xiàn)二叉樹的創(chuàng)建,代碼里生成結(jié)點和構(gòu)建左右子樹的代碼順序交換一下就行了
推薦教程:《javascript視頻教程》