本篇文章给大家介绍一下使用javascript实现二叉树的创建和遍历的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
1、先说二叉树的遍历,遍历方式:
前序遍历:先遍历根结点,然后左子树,再右子树
中序遍历:先遍历左子树,然后根结点,再右子树
后续遍历:先遍历左子树,然后右子树,再根结点
上代码:主要还是利用递归
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);}//后续遍历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('后续遍历')postordertraverse(mytree.createtree()); 二叉树的非递归遍历
深度优先遍历(主要利用栈的先进后出)
广度优先遍历(主要利用队列的先进先出)
//深度优先非递归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); } }}//广度优先非递归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); } }}深度优先主要是利用栈,先压右子树,再压左子树
广度优先主要利用队列,先入左子树,再入右子树
深度优先的遍历结果与前序遍历相同abdghceif,广度优先的遍历结果是 abcdefghi
2、创建二叉树
1中创建二叉树的方式过于笨拙,假入我们根据完全二叉树的模型建立自己的二叉树,空数据的地方用#表示,如下图所示我们称之为扩展二叉树,我们取其前序遍历的序列 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)你也可以用中序遍历或者后序遍历实现二叉树的创建,代码里生成结点和构建左右子树的代码顺序交换一下就行了
推荐教程:《javascript视频教程》