实现二叉树以及遍历二叉树

实现二叉树

定义节点:

//定义节点
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() 方法的访问路径。

 

posted @ 2016-11-24 14:35  半岛弥情  阅读(383)  评论(0编辑  收藏  举报