为了账号安全,请及时绑定邮箱和手机立即绑定
  • 1.前序遍历可用于复制一颗二叉树 2.中序便历可用于排序 3.后序遍历可以用在文件系统里
    查看全部
  • 计算机程序设计的本质是 将业务逻辑转化为数据逻辑
    查看全部
  • 这里漏了吧,不过没关系,也就截图上的内容

    查看全部
  • <!DOCTYPE html>

    <html lang="en">


    <head>

    <meta charset="UTF-8">

    <title>JavaScript二叉树中序算法</title>

    </head>


    <body>

    <script>

    function BinaryTree() {

    //初始化root根为空值

    var root = null;


    //将传入值添加this.key,this.left,this.right属性

    var Node = function (key) {

    this.key = key;

    this.left = null;

    this.right = null;

    };


    //将传入值进行判断,作为父节点的左支或右支

    var insertNode = function (node, newNode) {

    if (newNode.key < node.key) {

    //如果传入值小于父节点,作为左支,不过要先进行判断左支是否已经存在

    if (node.left === null) {

    //如果左支是null空值,将传入值作为左支

    node.left = newNode;

    } else {

    //否则(左支已经存在)继续执行函数进行下个节点的判断

    insertNode(node.left, newNode);

    }

    } else {

    //否则(传入值大于父节点)作为右支,不过要先进行判断右支是否已经存在

    if (node.right === null) {

    //如果右支是null空值,将传入值作为右支

    node.right = newNode;

    } else {

    //否则(右支已经存在)继续执行函数进行下个节点的判断

    insertNode(node.right, newNode);

    }

    }

    };


    //函数的入口,第一步执行的函数,确定root根的值

    this.insert = function (key) {

    var newNode = new Node(key);

    //newNode拥有newNode.key=key,newNode.left=null,newNode.right=null

    if (root === null) {

    root = newNode;

    //如果没有root根,将传入值作为root根

    } else {

    insertNode(root, newNode)

    //如果已经存在根,执行insertNode函数

    }

    };


    //将root根值和传入值(callback)赋给inOrderTraverseNod(),执行inOrderTraverseNod()

    this.inOrderTraverse = function (callback) {

    inOrderTraverseNode(root, callback);

    };

    };


    //传入子节点(callback)和父节点(node)(第一次的父节点就是root)

    var inOrderTraverseNode = function (node, callback) {

    //如果父节点存在,继续将左支和右支执行inOrderTraverseNod(),直到不存在子分支为止

    // !!注意if结构里面的函数执行顺序,先执行inOrderTraverseNode(node.left,callback);再执行callback(node.key);最后执行inOrderTraverseNode(node.right,callback);

    //当inOrderTraverseNode(node.left,callback);执行完之后,才会再执行callback(node.key);(即先打印完左分支的值,再打印最顶层的父节点,这样就达到了从小到大的排序效果).右分支同理

    if (node !== null) {

    inOrderTraverseNode(node.left, callback);

    callback(node.key);

    inOrderTraverseNode(node.right, callback);

    }

    };


    var nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13];


    //实例化BinaryTree

    var binaryTree = new BinaryTree();


    //遍历nodes数组,将每个数组的值(key)传入binary.insert(),执行insert()函数

    nodes.forEach(function (key) {

    binaryTree.insert(key);

    });


    //定义callback函数,将传入callback的值打印出来

    var callback = function (key) {

    console.log(key);

    };


    //注意此callback是参数,不是function函数,执行的是inOrderTraverse(),不是上面的callback()

    binaryTree.inOrderTraverse(callback);

    </script>

    </body>


    </html>


    查看全部
  • <!DOCTYPE html>

    <html lang="en">


    <head>

    <meta charset="UTF-8">

    <title>JavaScript二叉树中序算法</title>

    </head>


    <body>

    <script>

    function BinaryTree() {

    //初始化root根为空值

    var root = null;

    //将传入值添加this.key,this.left,this.right属性

    var Node = function (key) {

    this.key = key;

    this.left = null;

    this.right = null;

    };


    //将传入值进行判断,作为父节点的左支或右支

    var insertNode = function (node, newNode) {

    if (newNode.key < node.key) {

    //如果传入值小于父节点,作为左支,不过要先进行判断左支是否已经存在

    if (node.left === null) {

    //如果左支是null空值,将传入值作为左支

    node.left = newNode;

    } else {

    //否则(左支已经存在)继续执行函数进行下个节点的判断

    insertNode(node.left, newNode);

    }

    } else {

    //否则(传入值大于父节点)作为右支,不过要先进行判断右支是否已经存在

    if (node.right === null) {

    //如果右支是null空值,将传入值作为右支

    node.right = newNode;

    } else {

    //否则(右支已经存在)继续执行函数进行下个节点的判断

    insertNode(node.right, newNode);

    }

    }

    };


    //函数的入口,第一步执行的函数,确定root根的值

    this.insert = function (key) {

    var newNode = new Node(key);

    //newNode拥有newNode.key=key,newNode.left=null,newNode.right=null

    if (root === null) {

    root = newNode;

    //如果没有root根,将传入值作为root根

    } else {

    insertNode(root, newNode)

    //如果已经存在根,执行insertNode函数

    }

    };

    //将root根值和传入值(callback)赋给inOrderTraverseNod(),执行inOrderTraverseNod()

    this.inOrderTraverse=function(callback){

    inOrderTraverseNode(root,callback);

    };

    };


    //传入子节点(callback)和父节点(node)(第一次的父节点就是root)

    var inOrderTraverseNode=function(node,callback){

    //如果父节点存在,继续将左支和右支执行inOrderTraverseNod(),直到不存在子分支为止

    // !!注意if结构里面的函数执行顺序,先执行inOrderTraverseNode(node.left,callback);再执行callback(node.key);最后执行inOrderTraverseNode(node.right,callback);

    //当inOrderTraverseNode(node.left,callback);执行完之后,才会再执行callback(node.key);(即先打印完左分支的值,再打印最顶层的父节点,这样就达到了从小到大的排序效果).右分支同理

    if(node!==null){

    inOrderTraverseNode(node.left,callback);

    callback(node.key);

    inOrderTraverseNode(node.right,callback);

    }

    };


    var nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13];


    //实例化BinaryTree

    var binaryTree = new BinaryTree();


    //遍历nodes数组,将每个数组的值(key)传入binary.insert(),执行insert()函数

    nodes.forEach(function (key) {

    binaryTree.insert(key);

    });


    //定义callback函数,将传入callback的值打印出来

    var callback=function(key){

    console.log(key);

    };


    //注意此callback是参数,不是function函数,执行的是inOrderTraverse(),不是上面的callback()

    binaryTree.inOrderTraverse(callback);

    </script>

    </body>


    </html>


    查看全部
  • <!-- 稍微改造了一下下,可视化二叉树排序,非常有利于学习和理解哟!-->

    <!DOCTYPE html>    

    <html>    

    <title>二叉排序树</title>    

        <head>    

            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />    

        </head>    

        <body >    

            <canvas id="canvas" width="1366" height="768" ></canvas>

        </body>    

    </html>    

        

    <script type="text/javascript">

           

            //二叉算法函数    

           function BinaryTree(){

            //node 节点函数

            var Node=function(key){

                this.key=key;

                this.left=null;

                this.right=null;

                this.x = 0;//图形绘制坐标

                this.y = 0;//图形绘制坐标

            };


            /**二叉树可视图形描述**/

            this.graphical = [];//图形数组

            this.lrMove = 100;//左右偏移量

            this.udMove = 100;//上下偏移量

            /**==================**/


            //定义根节点

            var root=null;


            //插入节点 循环递归函数 左右分插

            this.insertNode=function(node,newNode){

                if(newNode.key < node.key){

                    if(node.left===null){

                        var x = node.x;

                        var y = node.y;

                        newNode.x = (x -= this.udMove); 

                        newNode.y = (y += this.lrMove);

                        node.left=newNode;     

                    }else{

                        this.insertNode(node.left,newNode);

                    }

                }else{

                    if(node.right===null){

                        var x = node.x;

                        var y = node.y;

                        newNode.x = (x += this.udMove); 

                        newNode.y = (y += this.lrMove);

                        node.right=newNode;

                    }else{

                        this.insertNode(node.right,newNode);

                    }

                }

            };


            //入口程序

            this.insert=function(key){

                var newNode= new Node(key);

                if(root===null){

                    root=newNode;

                    root.x = 500;

                    root.y = 100;

                    this.graphical.push(root);

                }else{

                    this.insertNode(root,newNode);

                }

            };


            var inOrdertraverseNode = function(node,callback){

                if(node !== null){

                    inOrdertraverseNode(node.left,callback);

                    callback(node.key);

                    inOrdertraverseNode(node.right,callback);

                }

            }


            this.inOrdertraverse = function(callback){

                inOrdertraverseNode(root,callback);

            }

        }


        var nodes=[8,3,10,1,6,14,4,15,12,13];

        var binaryTree=new BinaryTree;

        for(var i = 0 ; i < nodes.length ; i++){

             binaryTree.insert(nodes[i]);

        }


        var callback = function(key){

            console.log(key)

        }


        binaryTree.inOrdertraverse(callback);


        /*=====================================================开始绘制================================*/

        var canvas = document.getElementById("canvas");

        var context = canvas.getContext('2d');  //获取对应的2D对象(画笔)



        function draw(key,x,y){

            this.counter = 0;

            this.render = function(c){

                c.fillStyle = "hsl("+ this.counter +", 100%, 50%)";

                c.strokeStyle = '#fff'; //设置笔触的颜色

                c.font = "bold 40px '字体','字体','微软雅黑','宋体'"; //设置字体

                c.textBaseline = 'hanging'; //在绘制文本时使用的当前文本基线

                c.fillText(key ,x ,y); 

            }

            this.update = function(){

              this.counter += 5;

            }

        }


        var fontCavaseArr = [];


         function init() { 

            loop();//绘制文字        

            setInterval(run, 1000/30);

          }



        function run(x,y){

          context.fillStyle = "rgba(0,0,0,0.1)";

          context.fillRect(0,0,1366,768); //绘制 1366*768 像素的已填充矩形:

          for (i=0; i<fontCavaseArr.length; i++) {

            var particle = fontCavaseArr[i]; 

            particle.render(context); 

            particle.update(); 

          }

          gLine();//绘制线条

        }


        function loop(){

            font(binaryTree.graphical[0]);

        }


        function font(obj){

            if(obj.key != null && obj.key != undefined){

                var drawFont = new draw(obj.key,obj.x,obj.y);

                fontCavaseArr.push(drawFont);

            }

            if(obj.left != null && obj.left != undefined){

                var drawFont = new draw(obj.left.key,obj.left.x,obj.left.y);

                fontCavaseArr.push(drawFont);

                font(obj.left);

            }

            if(obj.right != null && obj.right != undefined){

                var drawFont = new draw(obj.right.key,obj.right.x,obj.right.y);

                fontCavaseArr.push(drawFont);

                font(obj.right);

            }

        }


        function gLine(){

            line(binaryTree.graphical[0]);

        }

        

        function line(obj){

            context.lineJoin="round";  

            context.lineCap="butt";  

            context.beginPath(); 

            if(obj.left != null && obj.left != undefined){

                context.moveTo(obj.x+20,obj.y+20); 

                context.lineTo(obj.left.x+20,obj.left.y+20);

                context.stroke();  

                context.closePath(); 

                line(obj.left);

            }

            if(obj.right != null && obj.right != undefined){

                context.moveTo(obj.x+20,obj.y+20); 

                context.lineTo(obj.right.x+20,obj.right.y+20);

                context.stroke();  

                context.closePath(); 

                line(obj.right);

            }

        }

        

        init();


    </script>    


    查看全部
    1. 根节点

    2. 中间节点

    3. 叶子结点

    4. 节点层次:二叉树的高

    5. 排序二叉树:左子节点值小于父节点,右子节点值大于父节点

    查看全部
  • <!Doctype  html>        //文档声明,便于解析

    breakpoints: 单步调式

    查看全部
  • * 任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    * 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    * 任意节点的左、右子树也分别为二叉查找树;
    * 没有键值相等的节点。

    第一个节点为根节点,最后的没有子节点的称为叶子节点,中间部分称为中间节点。

    查看全部
  • 单点调试功能,打断点
    查看全部
  • 这个太神奇了,原来可以通过将一个算法的数学模型,用代码表示出来,最于明白,算法,数据结构,编程之间的关系了
    查看全部
  • javascript借助react native 或lonic开发出来的程序,可以轻松跨越ios 与android
    查看全部
  • 前序遍历复制二叉树
    查看全部
  • 中序遍历-升序
    查看全部
  • 中序遍历、前序遍历、后序遍历
    查看全部

举报

0/150
提交
取消
课程须知
1、对html基础知识已经掌握。 2、对js的基本语法,例如数组,对象有一定的掌握。
老师告诉你能学到什么?
1、二叉树的定义,创建以及js编码实现 2、二叉树中序遍历的算法原理及js编码实现 3、二叉树前序遍历的算法原理及js编码实现 4、二叉树后续遍历的算法原理及js编码实现 5、二叉树节点查找的算法原理和编码实现

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!