javascript:二叉搜索树的实现

二叉搜索树:顾名思义,树上每个节点最多只有二根分叉;而且左分叉节点的值 < 右分叉节点的值 。

特点:插入节点、找最大/最小节点、节点值排序 非常方便

二叉搜索树-javascript实现
<script type="text/javascript">// <![CDATA[
    //打印输出
    function println(msg) {
        document.write(msg + " ");
    }
 
    //节点类
    var Node = function (v) {
        this.data = v; //节点值
        this.left = null; //左节点
        this.right = null; //右节点
    }
 
    //二叉搜索树类
    var BinarySearchTree = function () {
        this.root = null; //初始化时,根节点为空
        //插入节点
        //参数:v 为节点的值
        this.insert = function (v) {
            var newNode = new Node(v);
            if (this.root == null) {
                //树为空时,新节点,直接成为根节点
                this.root = newNode;
                return;
            }
            var currentNode = this.root; //工作“指针”节点(从根开始向下找)
            var parentNode = null;
            while (true) {
                parentNode = currentNode;
                if (v < currentNode.data) {
                    //当前节点的值 > 目标节点的值                    
                    //应该向左插,工作节点移到左节点
                    currentNode = currentNode.left;
                    if (currentNode == null) {
                        //没有左节点,则新节点,直接成为左节点
                        parentNode.left = newNode;
                        return; //退出循环
                    }
                }
                else {
                    //否则向右插,工作节点移到右节点
                    currentNode = currentNode.right;
                    if (currentNode == null) {
                        parentNode.right = newNode;
                        return;
                    }
                }
 
            }
        }
 
        //查找最小节点
        this.min = function () {
            var p = this.root; //工作节点   
            while (p != null && p.left != null) {
                p = p.left;
            }
            return p;
        }
 
        //查找最大节点
        this.max = function () {
            var p = this.root; //工作节点   
            while (p != null && p.right != null) {
                p = p.right;
            }
            return p;
        }
 
        //中序遍历
        this.inOrder = function (rootNode) {
            if (rootNode != null) {
                this.inOrder(rootNode.left); //先左节点
                println(rootNode.data); //再根节点
                this.inOrder(rootNode.right); //再右节点
            }
        }
 
        //先序遍历
        this.preOrder = function (rootNode) {
            if (rootNode != null) {
                println(rootNode.data); //先根
                this.preOrder(rootNode.left); //再左节点
                this.preOrder(rootNode.right); //再右节点
            }
        }
 
        //后序遍历
        this.postOrder = function (rootNode) {
            if (rootNode != null) {
                this.postOrder(rootNode.left); //先左节点
                this.postOrder(rootNode.right); //再右节点
                println(rootNode.data); //再根节点
            }
        }
    }
 
 
    //以下是测试
    var bTree = new BinarySearchTree();
    //《沙特.算法设计技巧与分析》书上图3.9 左侧的树
    
    bTree.insert(6);
    bTree.insert(3);
    bTree.insert(8);
    bTree.insert(1);
    bTree.insert(4);
    bTree.insert(9);
    
    println('中序遍历:')
    bTree.inOrder(bTree.root);
 
    println("<br/>");
 
    println("先序遍历:");
    bTree.preOrder(bTree.root);
 
    println("<br/>");
 
    println("后序遍历:");
    bTree.postOrder(bTree.root);
 
    println("<br/>");
    var minNode = bTree.min();
    println("最小节点:" + (minNode == null ? "不存在" : minNode.data));
 
    println("<br/>");
    var maxNode = bTree.max();
    println("最大节点:" + (maxNode == null ? "不存在" : maxNode.data));
// ]]></script>中序遍历: 1 3 4 6 8 9 <br> 先序遍历: 6 3 1 4 8 9 <br> 后序遍历: 1 4 3 9 8 6 <br> 最小节点:1 <br> 最大节点:9 

输出结果:

中序遍历: 1 3 4 6 8 9 
先序遍历: 6 3 1 4 8 9 
后序遍历: 1 4 3 9 8 6 
最小节点:1 
最大节点:9

作者: 菩提树下的杨过
出处: http://yjmyzz.cnblogs.com  
原文连接:http://www.cnblogs.com/yjmyzz/archive/2013/05/19/3087832.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值