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

本文介绍了树的基本概念,包括定义、结点的度、有序与无序树等,重点阐述了二叉树的特性及其五种关键性质。此外,还提供了二叉树的一种实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义:树(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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值