基于Javascript的二叉树实现【原创】

转载请注明出处

2016.7.7 by Totooria Hyperion

http://demo.th-shr.com:9999/

目前实现了:

前序遍历

中序遍历

后序遍历

层次遍历

求叶子节点的个数

求树的高度

对称树

判断某一节点是否在某一树种

求两节点的最近公共父节点

其他算法以后再慢慢补

首先是用了自己写的Class:

http://www.cnblogs.com/Totooria-Hyperion/p/5645096.html

二叉树声明如下:

Class("BinTree",function(tl,tr,tdata){
    this.tl = tl || null;
    this.tr = tr || null;
    this.tdata = tdata || null;
},{
    "createTree":function(preorder){
        var t = {},tl = {},tr = {};
        if(preorder.str[0] == "#") {
            preorder.str = preorder.str.substr(1);
            return null;
        } else {
            t = new BinTree();
            t.tdata = preorder.str[0];
            preorder.str = preorder.str.substr(1);
            tl = BinTree.prototype.createTree(preorder);
            t.setLeft(tl);
            tr = BinTree.prototype.createTree(preorder);
            t.setRight(tr);
            return t;
        }
    },
    "setLeft":function(ptr) {
        this.tl = ptr;
    },
    "setRight":function(ptr) {
        this.tr = ptr;
    },
    "getLeft":function(ptr) {
        return this.tl;
    },
    "getRight":function(ptr) {
        return this.tr;
    },
    "getData":function() {
        return this.tdata;
    }
});

BinTree.extend({
    "getPreOrder":function(obj) {
        (typeof obj.order == "undefined") ? obj.order = "" : obj;
        obj.order += this.tdata;
        var tl = this.getLeft(),tr = this.getRight();
        tl != null ? tl.getPreOrder(obj) : tl;
        tr != null ? tr.getPreOrder(obj) : tr;
        return obj.order;
    },
    "getInOrder":function(obj) {
        (typeof obj.order == "undefined") ? obj.order = "" : obj;
        var tl = this.getLeft(),tr = this.getRight();
        tl != null ? tl.getInOrder(obj) : tl;
        obj.order += this.tdata;
        tr != null ? tr.getInOrder(obj) : tr;
        return obj.order;
    },
    "getPostOrder":function(obj) {
        (typeof obj.order == "undefined") ? obj.order = "" : obj;
        var tl = this.getLeft(),tr = this.getRight();
        tl != null ? tl.getPostOrder(obj) : tl;
        tr != null ? tr.getPostOrder(obj) : tr;
        obj.order += this.tdata;
        return obj.order;
    },
    "getLevelOrder":function(obj) {
        (typeof obj.nodes == "undefined") ? obj.nodes = [] : obj;
        var cur = [this];
        while(cur.length != 0) {
            obj.nodes = obj.nodes.concat(cur);
            var _cur = [];
            for(var i=0;i<cur.length;i++) {
                var tl = cur[i].getLeft(),tr = cur[i].getRight();
                tl ? _cur.push(tl) : tl;
                tr ? _cur.push(tr) : tr;
            }
            cur = _cur;
        }
        var str = "";
        obj.nodes.forEach(function(item){
            str += item.tdata;
        });
        return str;
    },
    "getLeafSum":function(){
        var tl = this.getLeft(),tr = this.getRight();
        if(tl && tr) {
            return tl.getLeafSum() + tr.getLeafSum();
        } else if(!tl && !tr) {
            return 1;
        } else if (tl) {
            return tl.getLeafSum();
        } else {
            return tr.getLeafSum();
        }
    },
    "getHeight":function() {
        var tl = this.getLeft(),tr = this.getRight();
        if(!tl && !tr) {
            return 1;
        } else if(tl && tr) {
            return tl.getHeight() >= tr.getHeight() ? tl.getHeight() + 1 : tr.getHeight() + 1;
        } else if(tl) {
            return tl.getHeight() + 1;
        } else {
            return tr.getHeight() + 1;
        }
    },
    "swap":function() {
        var tl = this.getLeft(),tr = this.getRight();
        this.setLeft(tr);
        this.setRight(tl);
        tl != null ? tl.swap() : tl;
        tr != null ? tr.swap() : tr;
    },
    "isInTree":function(tree) {
        var bool = false;
        if(this == tree) {
            return true;
        } else {
            var tl = tree.getLeft(),tr = tree.getRight();
            var tlb = tl != null ? this.isInTree(tl) : false;
            var trb = tr != null ? this.isInTree(tr) : false;
            return tlb || trb;
        }
    },
    "getNearestCommonFather":function(flag,node1,node2,tree) {
        if(flag) {
            if(node1.isInTree(node2)) {
                return node2;
            } else if(node2.isInTree(node1)) {
                return node1;
            } else {
                var tl = tree.getLeft(),tr = tree.getRight();
                var inLeft = tl && node1.isInTree(tl) && node2.isInTree(tl);
                var inRight = tr && node1.isInTree(tr) && node2.isInTree(tr);
                if(!inLeft && !inRight) {
                    return tree;
                } else if(inLeft){
                    return this.getNearestCommonFather(1,node1,node2,tl);
                } else {
                    return this.getNearestCommonFather(1,node1,node2,tr);
                }
            }
        } else {
            if(node1.isInTree(tree) && node2.isInTree(tree)) {
                return this.getNearestCommonFather(1,node1,node2,tree);
            } else {
                return false;
            }
        }
    }
});

测试代码及测试结果如下:

var tree = BinTree.prototype.createTree({"str":"6423####51##7##"});
console.log(tree.getPreOrder({})); //6423517
console.log(tree.getInOrder({})); // 3246157
console.log(tree.getPostOrder({})); // 3241756
console.log(tree.getLevelOrder({})); // 6452173
console.log(tree.getLeafSum()); // 3
console.log(tree.getHeight()); // 4
tree.swap()
console.log("交换");
console.log(tree.getPreOrder({})); // 6571423
console.log(tree.getPostOrder({})); // 7153246
tree.swap()
console.log("交换");
console.log(tree.tr.tl.isInTree(tree));// true
console.log(BinTree.prototype.getNearestCommonFather(0,tree.tr.tl,tree.tr.tr,tree));
时间: 2024-10-10 10:33:43

基于Javascript的二叉树实现【原创】的相关文章

一款基于javascript的3D玻璃破碎特效

之前为大家介绍了一款 html5 canvas实现图片玻璃碎片特效.今天要给大家带来一款基于javascript的3D玻璃破碎特效.效果图如下: 在线预览   源码下载 html代码: <div id="container"> <div id="fragment"> </div> </div> css代码: body { background-color: #f1f1f1; margin: 0; overflow: h

构建基于Javascript的移动CMS——生成博客(二).路由

在有了上部分的基础之后,我们就可以生成一个博客的内容--BlogPosts Detail.这样就完成了我们这个移动CMS的几乎主要的功能了,有了上节想必对于我们来说要获取一个文章已经不是一件难的事情了. 获取每篇博客 于是我们照猫画虎地写了一个BlogDetail.js define([ 'jquery', 'underscore', 'mustache', 'text!/blog_details.html' ],function($, _, Mustache, blogDetailsTempl

构建基于Javascript的移动web CMS——Hello,World

在一篇构建基于Javascript的移动web CMS入门--简介中简单的介绍了关于墨颀CMS的一些原理,其极框架组成,于是开始接着应该说明一下这个CMS是如何一步步搭建起来. RequireJS 使用 库及依赖 这里用的是bower的JS来下载库,详细可以参考一下bower install js使用bower管理js 这篇文章. 需要下载的库有 RequireJS Backbone Underscore Mustache jQuery 使用RequireJS 引用官网的示例 <!DOCTYPE

CodeMirror:基于JavaScript的代码编辑器

官方网站定义: http://codemirror.net/ CodeMirror is a versatile text editor implemented in JavaScript for the browser. It is specialized for editing code, and comes with a number of language modes and addons that implement more advanced editing functionalit

构建基于Javascript的移动CMS——生成博客(一)

在墨颀 CMS中的动态的文章是从我博客的API加载过来的,因为当前没有其他好的CMS当接口.之前直接拿博客的DB文件+Nodejs+RESTify生成了一个博客的API,而且可以支持跨域请求. 简单的博客构成 这次我们可以简单的做一个可以供移动平台阅读的博客,除了不能写作以外(ps:不能写作还能叫博客么).对于写博客的人来说更多的只是写,而对于读者来说,他们只需要读,所以在某种意义上可以将博客的写和读分离开来. 对于用户来说,博客是由两个页面构建的: 博文列表(blogposts list) 博

构建基于Javascript的移动web CMS——模板

在上一篇<构建基于Javascript的移动CMS--Hello,World>讲述了墨颀 CMS的大概组成,并进行了一个简单的演示样例,即Hello,World.这一次,我们将把CMS简单的放到一个能够执行的服务器环境中,也就是说我们须要一个简单的执行环境,以便于进行更有意思的东西--加入?模板. 開始之前 环境准备 类Unix系统 由于电脑上已经装有python了,这里便用python起一个简单的server,对于GNU/Linux.Mac OS等类unix系统来说,都能够这样执行: pyt

构建基于Javascript的移动CMS——生成博客(三).重构

当前墨颀CMS的一些基础功能设计已经接近尾声了,在完成博客的前两部分之后,我们需要对此进行一个简单的重构.为的是提取出其中的获取Blog内容的逻辑,于是经过一番努力之后,终于有了点小成果. 墨颀CMS 重构 我们想要的结果,便是可以直接初始化及渲染,即如下的结果: initialize: function(){ this.getBlog(); }, render: function(response){ var about = { about:aboutCMS, aboutcompany:url

构建基于Javascript的移动web CMS——加载JSON文件

在上一篇中说到了如何创建一个Django Tastypie API给移动CMS用,接着我们似乎也应该有一个本地的配置文件用于一些简单的配置,如"获取API的URL"."产品列表"."SEO"(在一开始的时候发现这是不好的,后面又发现Google的爬虫可以运行Javascript,不过也是不推荐的.)这些东西是不太需要修改的,直接写在代码中似乎又不好,于是放到了一个叫作configure.json的文件里. RequireJS Plugins 网上

基于javascript用olamisdk实现web端语音识别语义理解(speex压缩)

转载请注明原文地址:http://blog.csdn.net/ls0609/article/details/73920229 olami开放平台sdk除了支持语音识别功能外,更强大的在于支持语义理解功能,在Android平台和iOS平台都有示例demo供大家下载. 语音在线听书demo:http://blog.csdn.net/ls0609/article/details/71519203 语音记账demo:http://blog.csdn.net/ls0609/article/details/