JavaScript实现排序二叉树的相关算法

1.创建排序二叉树的构造函数

/**
         * 创建排序二叉树的构造函数
         * @param valArr 排序二叉树中节点的值
         * @constructor
         */
        function BinaryTree(valArr) {
            function Node(val) {
                this.value = val;
                this.left = null;
                this.right = null;
            }
            var root = null;
           valArr.forEach(function (val) {
                var newNode = new Node(val);
                if(root === null){
                    root = newNode;
                } else {
                    this.insetNode(root,newNode);
                }
           },this);
            this.root = root;
        }

2.向排序二叉树中插入节点

// 向二叉树中插入节点
        BinaryTree.prototype.insetNode = function (node, newNode) {
            if(newNode.value > node.value){
                if(node.right === null){
                    node.right = newNode;
                } else {
                    this.insetNode(node.right,newNode);
                }
            } else {
                if(node.left === null){
                    node.left = newNode;
                } else {
                    this.insetNode(node.left,newNode);
                }
            }
        };

3.中序遍历

  // 中序遍历
BinaryTree.prototype.LFR = function () {
            const result = [];
            function computed(node) {
                if(node !== null ){
                    computed(node.left);
                    result.push(node.value);
                    computed(node.right);
                }
            }
            computed(this.root);
            return result;
        };

4.前序遍历

 // 前序遍历
        BinaryTree.prototype.FLR = function () {
            const result = [];
            function computed(node) {
                if(node !== null ){
                    result.push(node.value);
                    computed(node.left);
                    computed(node.right);
                }
            }
            computed(this.root);
            return result
        };

5.后序遍历

 // 后序遍历
        BinaryTree.prototype.RFL = function () {
            const result = [];
            function computed(node) {
                if(node !== null ){
                    computed(node.right);
                    result.push(node.value);
                    computed(node.left);
                }
            }
            computed(this.root);
            return result
        };

6.获取最小值

// 获取二叉树中的最小值
        BinaryTree.prototype.getMin = function (node) {
            var min = null;
            function computed(node) {
                if(node){
                    if(node.left){
                        computed(node.left);
                    } else {
                        min = node.value;
                    }
                }
            }
            computed(node || this.root);
            return min;
        };

7.获取最大值

 // 获取二叉树中的最大值
        BinaryTree.prototype.getMax = function (node) {
            var Max = null;
            function computed(node) {
                if(node){
                    if(node.right){
                        computed(node.right);
                    } else {
                        Max = node.value;
                    }
                }
            }
            computed(node || this.root);
            return Max;
        };

8.查找给定的值

 // 查找给定值
        BinaryTree.prototype.findVal = function (val,node) {
            function find(node) {
                if(node){
                    if(node.value === val) return true;
                    else if(val > node.value) return find(node.right);
                    else {
                        return find(node.left);
                    }
                } else {
                    return false;
                }

            }
            return find(node || this.root);
        };

9.删除节点

// 删除节点
        BinaryTree.prototype.removeNode = function (val,node) {
            function remove(val,node) {
                if(!node) return null;
                if(val > node.value) {
                    node.right =  remove.call(this,val,node.right);
                } else if(val < node.value){
                    node.left =  remove.call(this,val,node.left);
                } else {
                    // 要删除的节点没有左孩子也没有右孩子
                    if(node.right === null && node.left === null){
                        return null;
                    }
                    // 只有右孩子没有左孩子
                    else if(node.right && node.left === null){
                        return node.right;
                    }
                    // 只有左孩子没有右孩子
                    else if (node.left && node.right === null) {
                        return node.left;
                    }
                    // 有左孩子也有右孩子
                    else {
                        var min = this.getMin(node.right);
                        node.value = min;
                        node.right =  remove.call(this,min, node.right);
                        return node;
                    }
                }
                return node;
            }
            remove.call(this,val,node || this.root);
        };

10.使用上面的方法

var binaryTree = new BinaryTree([10,4,2,14,3,15,13,12,6,9]);
        console.log(‘中序遍历‘,binaryTree.LFR());
        console.log(‘前序遍历‘,binaryTree.FLR());
        console.log(‘后序遍历‘,binaryTree.RFL());
        console.log(‘最小值‘,binaryTree.getMin());
        console.log(‘最大值‘,binaryTree.getMax());
        console.log(binaryTree.findVal(4));
        binaryTree.removeNode(3);

原文地址:https://www.cnblogs.com/QxQstar/p/8350618.html

时间: 2024-10-28 20:17:58

JavaScript实现排序二叉树的相关算法的相关文章

二叉树及排序二叉树的相关操作汇总

前记:由于种种原因,以前一看到什么树啊链表啊,那就相当的恐惧,真是惭愧,最近仔细研究了一下这些东西,发现也就那样,或许是我之前根本就没怎么花心思学.. 话不多说,下面就直接上代码吧,也没什么好解释的,只要我自己理解代码就行了,哈哈哈... 代码参考<C和C++程序员面试秘笈>一书 // Tree.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stack> #include <queue>

二叉树的相关算法(一)

1.求二叉树所有的节点数 2.求二叉树所有的叶子节点数 3.求二叉树最小值的节点值 4.求二叉树所有节点值之和 5.求二叉树节点值为x的个数 6.删除二叉树 //求二叉树所有的节点数 int nodes(BTNode *r){ if(r==0) return 0; else return nodes(r->lchild)+nodes(r->rchild)+1; } //求二叉树所有的叶子节点数 int leafNodes(BTNode *r){ if(r==NULL) return 0; el

一步一步写算法(之排序二叉树删除-1)

原文:一步一步写算法(之排序二叉树删除-1) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 相比较节点的添加,平衡二叉树的删除要复杂一些.因为在删除的过程中,你要考虑到不同的情况,针对每一种不同的情况,你要有针对性的反应和调整.所以在代码编写的过程中,我们可以一边写代码,一边写测试用例.编写测试用例不光可以验证我们编写的代码是否正确,还能不断提高我们开发代码的自信心.这样,即使我们在开发过程对代码进行修改或者优化也不会担心害怕.然而看起

【JavaScript】【算法】JavaScript版排序算法

JavaScript版排序算法:冒泡排序.快速排序.插入排序.希尔排序(小数据时,希尔排序会比快排快哦) 1 //排序算法 2 window.onload = function(){ 3 var array = [0,1,2,44,4, 4 324,5,65,6,6, 5 34,4,5,6,2, 6 43,5,6,62,43, 7 5,1,4,51,56, 8 76,7,7,2,1, 9 45,4,6,7,8]; 10 //var array = [4,2,5,1,0,3]; 11 array

数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n(≥0)结点组成的有限集合.{N.沃恩}     (树是n(n≥1)个结点组成的有限集合.{D.E.Knuth})      在任意一棵非空树中:        ⑴有且仅有一个没有前驱的结点----根(root).        ⑵当n>1时,其余结点有且仅有一个直接前驱.         ⑶所有结

算法学习之查找(顺序、二分法、排序二叉树以及 Hash 表)

[摘要]查找--用关键字标识一个数据元素,查找时根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素.在计算机中进行查找的方法是根据表中的记录的组织结构确定的.查找功能数据处理的一个基本功能.数据查找并不复杂,但是如何实现数据又快又好地查找呢?前人在实践中积累的一些方法,值得我们好好学些一下.我们假定查找的数据唯一存在,数组中没有重复的数据存在. 1. 顺序查找 设想有一个1M的数据,我们如何在里面找到我们想要的那个数据.此时数据本身没有特征,所以我们需要的那个数据可能出现在数组

一步一步写算法(之排序二叉树)

原文:一步一步写算法(之排序二叉树) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面我们讲过双向链表的数据结构.每一个循环节点有两个指针,一个指向前面一个节点,一个指向后继节点,这样所有的节点像一颗颗珍珠一样被一根线穿在了一起.然而今天我们讨论的数据结构却有一点不同,它有三个节点.它是这样定义的: typedef struct _TREE_NODE { int data; struct _TREE_NODE* parent; str

javascript常用排序算法实现

毕业后,由于工作中很少需要自已去写一些排序,所以那些排序算法都忘得差不多了,不过排序是最基础的算法,还是不能落下啦,于是找了一些资料,然后用Javascript实现了一些常用的算法,具体代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>

一步一步写算法(之排序二叉树线索化)

原文:一步一步写算法(之排序二叉树线索化) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面我们谈到了排序二叉树,还没有熟悉的同学可以看一下这个,二叉树基本操作.二叉树插入.二叉树删除1.删除2.删除3.但是排序二叉树也不是没有缺点,比如说,如果我们想在排序二叉树中删除一段数据的节点怎么办呢?按照现在的结构,我们只能一个一个数据查找验证,首先看看在不在排序二叉树中,如果在那么删除:如果没有这个数据,那么继续查找.那么有没有方法,可以保