javascript数据结构系列(六)-树和二叉树(1)

定义:树(Tree)是 n(n0) 个结点的有限集。在任意一颗非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当 n>1 时,其余结点可分为 m(m>0) 个互不相交的有限集 T1,T2,...,Tm ,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。

数的结点包含一个数据元素及若干指向其子树的分支。节点拥有的子树数称为结点的度。度为0的结点称为叶子或终端结点。度不为0的结点称为非终端结点或分支结点。除根结点外,分支节点也称为内部结点。树的度是树内各结点的度的最大值。结点的子树的根称为该结点的孩子,相应的,该结点称为孩子的双亲。

结点的层次从根开始定义起,根为第一层,根的孩子为第二层。如果将树中结点的各子树看成从左至右是有次序的,则称该树为有序树,否则称为无序树。

二叉树

二叉树是另一种树形结构,他的特点是每个结点之多只有两颗子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。

二叉树具有以下几个重要特性

性质1 在二叉树的第 i 层上至多有2i1个结点( i1
性质2 深度为 k 的二叉树至多有2k1个结点( k1
性质3 对任何一棵二叉树T,如果其终端结点数为 n0 ,度为2的结点数为 n2 ,则 n0=n2+1
性质4 具有 n 个结点的完全二叉树的深度为log2n+1
性质5 如果对一棵有 n 个结点的完全二叉树(其深度为log2n+1)的结点按层序编号(从第1层到第 log2n+1 层,每层从左到右),则对任意结点 i(1in) 有:
(1)如果 i=1 ,则结点 i 是二叉树的根,无双亲;如果i>1,则其双亲PARENT( i )是结点i/2
(2)如果 2i>n ,则结点 i 无左孩子(结点i为叶子结点);否则其做孩子LCHILD( i )是结点2i
(3)如果 2i+1>n ,则结点 i 无右孩子;否则其右孩子RCHILD(i)是结点 2i+1

二叉树的实现

function BiNode(data,lchild,rchild){
    this.data = data;
    this.lchild = lchild;
    this.rchild = rchild;
    this.show = show;
    function show(){
        return this.data;
    };
};
function BiTree(){
    this.root = null;
};
BiTree.prototype = {
    insert:function(data){
        var newNode = new BiNode(data,null,null);
        //判断是否存在根结点,没有将新结点插入
        if(this.root === null){
            this.root = newNode;
        }else{
            //查找根结点
            var current = this.root;
            var parent;
            while(true){
                //将当前结点保存为父节点
                parent = current;
                //将小的结点放在左边
                if(data < current.data){
                    //获取当前结点的左结点
                    currrent = current.lchild;
                    //判断当前结点的左结点是否有数据
                    if(currrent === null){
                        //若没有数据将新结点存入当前结点的左结点
                        parent.lchild = newNode;
                        break;
                    }
                }else{
                    current = current.rchild;
                    if(current === null){
                        //若没有数据将新结点存入当前结点的左结点
                        parent.rchild = newNode;
                        break;
                    }
                }
            }
        }
    },
    searchNode:function(data){
        var current = this.root;
        while(current !== null){
            if(data === current.data){
                return current;
            }else if(data < current.data){
                current = current.lchild;
            }else{
                current = current.rchild;
            }
        }
        return null;
    },
    preOrderTraverse:function(node){
        var data = [];
        _preOrder(node,data);
        console.log(data);
        return data;
    },
};
function _preOrder(node,data){
    if(!(node == null)){
      data.push(node.show());
      _preOrder(node.left,data);
      _preOrder(node.right,data);
    }
};

var T = new BiTree();
T.insert('A');
T.insert('B');
T.insert('C');
T.preOrderTraverse();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值