实现二叉树以及遍历二叉树
实现二叉树
定义节点:
//定义节点 function Node(data, left, right) { this.data = data; this.left = left; this.right = right; this.show = show; } //显示节点数据 function show() { return this.data; }
实现二叉树类前,我们要先知道插入实现算法
查找正确插入点的算法如下。
(1) 设根节点为当前节点。
(2) 如果待插入节点保存的数据小于当前节点,则设新的当前节点为原节点的左节点;反之,执行第4 步。
(3) 如果当前节点的左节点为null,就将新的节点插入这个位置,退出循环;反之,继续执行下一次循环。
(4) 设新的当前节点为原节点的右节点。
(5) 如果当前节点的右节点为null,就将新的节点插入这个位置,退出循环;反之,继续执行下一次循环。
//定义二叉树类 function BT() { this.root = null; this.insert = insert; this.inOrder = inOrder; } function insert(data) { var n = new Node(data, null, null); if (this.root == null) { this.root = n; } else { var current = this.root; var parent; while (true) { parent = current; if (data < current.data) { current = current.left; if (current == null) { parent.left = n; break; } } else { current = current.right; if (current == null) { parent.right = n; break; } } } } }
遍历二叉树
遍历二叉树有三种方式:中序、先序和后序。
中序遍历按照节点上的键值,以升序访问BT 上的所有节点。先序遍历先访问根节点,然后以同样方式访问左子树和右子树。后序遍历先访问叶子节点,从左子树到右子树,再到根节点。
中序
采用递归,实现代码如下:
function inOrder(node) { if (!(node == null)) { inOrder(node.left); console.log(node.show() + " "); inOrder(node.right); } }
测试代码:
var nums = new BT(); nums.insert(56); nums.insert(22); nums.insert(81); nums.insert(10); nums.insert(30); nums.insert(77); nums.insert(92); inOrder(nums.root);
下图展示了inOrder() 方法的访问路径。
先序
function preOrder(node) { if (!(node == null)) { console.log(node.show() + " "); preOrder(node.left); preOrder(node.right); } }
注意inOrder() 和preOrder() 方法的唯一区别,就是if 语句中代码的顺序。在inOrder()方法中,show() 函数像三明治一样夹在两个递归调用之间;在preOrder() 方法中,show()函数放在两个递归调用之前。
下图展示了preOrder() 方法的访问路径。
后序
function postOrder(node) { if (!(node == null)) { postOrder(node.left); postOrder(node.right); console.log(node.show() + " "); } }
下图展示了postOrder() 方法的访问路径。