JS数据结构:树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/PingZhi_6766/article/details/78077124

树(tree)形结构是一种重要的非线性结构,依据分支关系定义的层次结构,在这种结构中,每个元素至多只有一个前趋,但可以有多个后继。

树的定义:树(Tree)是n(n 大于等于0)个节点的有限集合T,当n=0时称为空树,否则,称为非空树。

常用的树形表示方法有: 1。集合嵌套法2.凹入表表示法 

    

 

3.广义表表示法

(A(B(E(k),F),C(G),D(H,I,J))

 

4.树形表示法 (最常见的表示法)

 

的基本术语:

节点:就是指树中的元素

子节点: 树中一个节点的 直属下级节点

父节点: 当前节点的前趋节点

祖先节点:当前节点的前趋节点(非父节点)

子孙节点:当前结点的下属节点(非直接下属节点)

叶子节点:没有子节点的节点元素

节点的层次:根节点是第一层节点,表示节点的所属的层数

深度:树的层数,表示树的深度

森林: n棵互不相交的树的集合

 

二叉树

二叉树是另一种特殊的树形结构,它的特定是每个至多有两棵树,二叉树的子节点有左右之分,其次序不能任意颠倒。二叉树的结构简单,存储效率较高,运算的算法也相对简单。并且任何树或森林与二叉树之间可以通过简单的操作规则相互转换,在树的应用中,它起着举足轻重的作用。

二叉查找树:一种特殊的二叉树,相对较小的值保存在左节点中,较大的值保存在右节点中,二叉查找树一种有序树。

1.实现二叉查找树

首先定义一个Node节点类:

 

function Node(data, left, right) {
    this.data = data;
    this.left = left;
    this.right = right;
    this.show = show;
}

function show() {
    return this.data;
}

接着定义一个二叉查找树的插入元素的方法,插入的时候把值小的放在树节点的左侧,较大的放在右侧

 

 

function insert(data) {
    var n = new Node(data, null, null);
    if (!this.root) {
        this.root = n;
    } else {
        var current = this.root, parent;
        while (true) {
            parent = current;
            if (data < current.data) {
                current = current.left;
                if (!current) {
                    parent.left = n;
                    break;
                }
            } else {
                current = current.right;
                if (!current) {
                    parent.right = n;
                    break;
                }
            }
        }
    }
} 


实现了插入元素, 我们也要能够遍历树的所有节点,有3种遍历方式:中序遍历、先序遍历和后序遍历。中序遍历按照节点上的键值,以升序访问树上的所有节点。先序遍历先访问根节点,然后以同样方式访问左子树和右子树。后序遍历先访问叶子节点,从左子树,再到根节点。

完整

 

 

function BST () {
    this.root = null;
    this.insert = insert;
    this.inOrder = inOrder;
    this.preOrder = preOrder;
    this.postOrder = postOrder;
}

//中序遍历
function inOrder (node) {
    if (node) {
        inOrder(node.left);
        console.log(node.show());
        inOrder(node.right);
    }
}

//先序遍历
function preOrder (node) {
    if (node) {
        console.log(node.show());
        preOrder(node.left);
        preOrder(node.right);
    }
}

//后序遍历
function postOrder (node) {
    if (node) {
        postOrder(node.left);
        postOrder(node.right);
        console.log(node.show());
    }
}


先序遍历的运行结果:

 

先序遍历的结果:

后序遍历的结果:

在二叉查找树上进行查找:

1.查找给定值

2.查找最大值

3.查找最小值

由于二叉查找树是排好序的树,左子树小,右子树大,查找最大值和最小值就很简单,直接给出代码:

 

function getMin () {
    var current =nums.root;
    while (current.left) {
        current = current.left;
    }
    return current.data;
}

function getMax () {
    var current = nums.root;
    while (current.right) {
        current = current.right;
    }
    return current.data;
}


查找给特定的值,先要和当前节点比较,不过和当前节点的数据不相等,那么要判断接下来是要向左遍历还是向右遍历。

 

 

function find (data) {
    var current = nums.root;
    while (current) {
        if (current.data === data) {
            return current;
        } else if (data < current.data) {
            current = current.left;
        } else {
            current = current.right;
        }
    }
    return null;
}

 

 

* 注意 上面3个函数中引用了我的创建的变量 nums

测试结果如下:

 

从二叉查找树上删除节点

 如果待删除的节点是叶子节点,那么只需要将从父节点指向它的连接指向null;如果待删除的节点只包含一个子节点,那么原本指向它的节点就得做些调整,使其指向它的子节点;如果待删除的节点包含两个子节点,正确的做法有两种:要么查找待删除的节点左子树上的最大值,要么查找其右子树上的最小值。这里我选用后一种方式。

 

function removeNode (node, data) {
    if (!node) {
        return null;
    }
    if (data === node.data) {
        //没有子节点
        if ((!node.left) && (!node.right)) {
            return null;
        }
        //没有左子节点的节点
        if (!node.left) {
            return node.right;
        }
        //没有右子节点
        if (!node.right) {
            return node.left;
        }
        //有两个子节点的节点

        //这里先拿到右子树上的最小值的节点,
        var tempNode = getSmallest (node.right);
        node.data = tempNode.data;
        node.right = removeNode(node.right, tempNode.data);
        return node;
    } else if (data < node.data) {
        node.left = removeNode(node.left, data);
        return node;
    } else {
        node.right = removeNode(node.right, data);
        return node;
    }
}

 

 

 

 

 

 

 

 

展开阅读全文

没有更多推荐了,返回首页