`
sungine
  • 浏览: 27578 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于B树的学习笔记

 
阅读更多

学习来源:http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html
B-树、B+树、B*树
之所以关注这个问题有两个原因:
1.oracle的索引组织表(IOT)是用B-树管理的
2.上次面试时被问到了这个问题,没有完全答出来

二叉树内容 略

B树 B-树
异名 同体 指的是一种多路搜索树

简单总结其特点 就是
1.每个节点的关键字数量是有 上下限要求的 取决于M(大约为M的一半),且关键字是从小到大的
2.然后每个节点的指针数量是关键字个数+1
3.指针的指向原则是,根据关键字划分数学区间(左开右开),分配其子节点,再按从小到大顺序安排指针与子节点的对应关系
4.关键字存在节点上,找到就可取

B+树

与 B-树 大致类似 区别在于 一个思路的变化:
B+树考虑到某些关键字太过复杂不适合存储在 节点上,于是便把所有关键字放到 树结构的最底层
叶节点存储
如此便有一系列的变化:
1.关键字树与指针树相等
2.指针的指向原则改为,关键子划分的数学区间为左闭右开区间
3.在父命中时 也要到叶节点取数据

B*树

B+多了就变成*了
为了达到增加树结构的使用率(降低分裂的消耗)的目的
对每个节点增加了一个指针,指向其同级 兄弟节点,这样在分裂时,节点需要对 父,兄弟,及自身负责,多方考察完资源后 ,再确定分裂的方式,降低了分裂概率

引用小结

引用
      B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于

走右结点;

       B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键

字范围的子结点;

       所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

       B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点

中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

       B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率

从1/2提高到2/3;

 

 

 

附件:B+tree 的Java实现

 

package com.meidusa.test;

public interface B {
	   public Object get(Comparable key);   //查询
	   public void remove(Comparable key);    //移除
	   public void insertOrUpdate(Comparable key, Object obj); //插入或者更新,如果已经存在,就更新,否则插入
}

 

 

 

package com.meidusa.test; 
 
import java.util.Random; 
 
public class BplusTree implements B { 
     
    /** 根节点 */ 
    protected Node root; 
     
    /** 阶数,M值 */ 
    protected int order; 
     
    /** 叶子节点的链表头*/ 
    protected Node head; 
     
    public Node getHead() { 
        return head; 
    } 
 
    public void setHead(Node head) { 
        this.head = head; 
    } 
 
    public Node getRoot() { 
        return root; 
    } 
 
    public void setRoot(Node root) { 
        this.root = root; 
    } 
 
    public int getOrder() { 
        return order; 
    } 
 
    public void setOrder(int order) { 
        this.order = order; 
    } 
 
    @Override 
    public Object get(Comparable key) { 
        return root.get(key); 
    } 
 
    @Override 
    public void remove(Comparable key) { 
        root.remove(key, this); 
 
    } 
 
    @Override 
    public void insertOrUpdate(Comparable key, Object obj) { 
        root.insertOrUpdate(key, obj, this); 
 
    } 
     
    public BplusTree(int order){ 
        if (order < 3) { 
            System.out.print("order must be greater than 2"); 
            System.exit(0); 
        } 
        this.order = order; 
        root = new Node(true, true); 
        head = root; 
    } 
     
    //测试 
    public static void main(String[] args) { 
        BplusTree tree = new BplusTree(6); 
        Random random = new Random(); 
        long current = System.currentTimeMillis(); 
        for (int j = 0; j < 100000; j++) { 
            for (int i = 0; i < 100; i++) { 
                int randomNumber = random.nextInt(1000); 
                tree.insertOrUpdate(randomNumber, randomNumber); 
            } 
 
            for (int i = 0; i < 100; i++) { 
                int randomNumber = random.nextInt(1000); 
                tree.remove(randomNumber); 
            } 
        } 
 
        long duration = System.currentTimeMillis() - current; 
        System.out.println("time elpsed for duration: " + duration); 
        int search = 80; 
        System.out.print(tree.get(search)); 
    } 
 
} 
 

 

 

package com.meidusa.test;

import java.util.Random;

public class BplusTree implements B {
	
	/** 根节点 */
	protected Node root;
	
	/** 阶数,M值 */
	protected int order;
	
	/** 叶子节点的链表头*/
	protected Node head;
	
	public Node getHead() {
		return head;
	}

	public void setHead(Node head) {
		this.head = head;
	}

	public Node getRoot() {
		return root;
	}

	public void setRoot(Node root) {
		this.root = root;
	}

	public int getOrder() {
		return order;
	}

	public void setOrder(int order) {
		this.order = order;
	}

	@Override
	public Object get(Comparable key) {
		return root.get(key);
	}

	@Override
	public void remove(Comparable key) {
		root.remove(key, this);

	}

	@Override
	public void insertOrUpdate(Comparable key, Object obj) {
		root.insertOrUpdate(key, obj, this);

	}
	
	public BplusTree(int order){
		if (order < 3) {
			System.out.print("order must be greater than 2");
			System.exit(0);
		}
		this.order = order;
		root = new Node(true, true);
		head = root;
	}
	
	//测试
	public static void main(String[] args) {
		BplusTree tree = new BplusTree(6);
		Random random = new Random();
		long current = System.currentTimeMillis();
		for (int j = 0; j < 100000; j++) {
			for (int i = 0; i < 100; i++) {
				int randomNumber = random.nextInt(1000);
				tree.insertOrUpdate(randomNumber, randomNumber);
			}

			for (int i = 0; i < 100; i++) {
				int randomNumber = random.nextInt(1000);
				tree.remove(randomNumber);
			}
		}

		long duration = System.currentTimeMillis() - current;
		System.out.println("time elpsed for duration: " + duration);
		int search = 80;
		System.out.print(tree.get(search));
	}

}
 

package com.meidusa.test; 
 
import java.util.AbstractMap.SimpleEntry; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map.Entry; 
 
public class Node { 
     
    /** 是否为叶子节点 */ 
    protected boolean isLeaf; 
     
    /** 是否为根节点*/ 
    protected boolean isRoot; 
 
    /** 父节点 */ 
    protected Node parent; 
     
    /** 叶节点的前节点*/ 
    protected Node previous; 
     
    /** 叶节点的后节点*/ 
    protected Node next;     
     
    /** 节点的关键字 */ 
    protected List<Entry<Comparable, Object>> entries; 
     
    /** 子节点 */ 
    protected List<Node> children; 
     
    public Node(boolean isLeaf) { 
        this.isLeaf = isLeaf; 
        entries = new ArrayList<Entry<Comparable, Object>>(); 
         
        if (!isLeaf) { 
            children = new ArrayList<Node>(); 
        } 
    } 
 
    public Node(boolean isLeaf, boolean isRoot) { 
        this(isLeaf); 
        this.isRoot = isRoot; 
    } 
     
    public Object get(Comparable key) { 
         
        //如果是叶子节点 
        if (isLeaf) { 
            for (Entry<Comparable, Object> entry : entries) { 
                if (entry.getKey().compareTo(key) == 0) { 
                    //返回找到的对象 
                    return entry.getValue(); 
                } 
            } 
            //未找到所要查询的对象 
            return null; 
             
        //如果不是叶子节点 
        }else { 
            //如果key小于等于节点最左边的key,沿第一个子节点继续搜索 
            if (key.compareTo(entries.get(0).getKey()) <= 0) { 
                return children.get(0).get(key); 
            //如果key大于节点最右边的key,沿最后一个子节点继续搜索 
            }else if (key.compareTo(entries.get(entries.size()-1).getKey()) >= 0) { 
                return children.get(children.size()-1).get(key); 
            //否则沿比key大的前一个子节点继续搜索 
            }else { 
                for (int i = 0; i < entries.size(); i++) { 
                    if (entries.get(i).getKey().compareTo(key) <= 0 && entries.get(i+1).getKey().compareTo(key) > 0) { 
                        return children.get(i).get(key); 
                    } 
                }    
            } 
        } 
         
        return null; 
    } 
     
    public void insertOrUpdate(Comparable key, Object obj, BplusTree tree){ 
        //如果是叶子节点 
        if (isLeaf){ 
            //不需要分裂,直接插入或更新 
            if (contains(key) || entries.size() < tree.getOrder()){ 
                insertOrUpdate(key, obj); 
                if (parent != null) { 
                    //更新父节点 
                    parent.updateInsert(tree); 
                } 
 
            //需要分裂   
            }else { 
                //分裂成左右两个节点 
                Node left = new Node(true); 
                Node right = new Node(true); 
                //设置链接 
                if (previous != null){ 
                    previous.setNext(left); 
                    left.setPrevious(previous); 
                } 
                if (next != null) { 
                    next.setPrevious(right); 
                    right.setNext(next); 
                } 
                if (previous == null){ 
                    tree.setHead(left); 
                } 
 
                left.setNext(right); 
                right.setPrevious(left); 
                previous = null; 
                next = null; 
                 
                //左右两个节点关键字长度 
                int leftSize = (tree.getOrder() + 1) / 2 + (tree.getOrder() + 1) % 2;  
                int rightSize = (tree.getOrder() + 1) / 2; 
                //复制原节点关键字到分裂出来的新节点 
                insertOrUpdate(key, obj); 
                for (int i = 0; i < leftSize; i++){ 
                    left.getEntries().add(entries.get(i)); 
                } 
                for (int i = 0; i < rightSize; i++){ 
                    right.getEntries().add(entries.get(leftSize + i)); 
                } 
                 
                //如果不是根节点 
                if (parent != null) { 
                    //调整父子节点关系 
                    int index = parent.getChildren().indexOf(this); 
                    parent.getChildren().remove(this); 
                    left.setParent(parent); 
                    right.setParent(parent); 
                    parent.getChildren().add(index,left); 
                    parent.getChildren().add(index + 1, right); 
                    setEntries(null); 
                    setChildren(null); 
                     
                    //父节点插入或更新关键字 
                    parent.updateInsert(tree); 
                    setParent(null); 
                //如果是根节点     
                }else { 
                    isRoot = false; 
                    Node parent = new Node(false, true); 
                    tree.setRoot(parent); 
                    left.setParent(parent); 
                    right.setParent(parent); 
                    parent.getChildren().add(left); 
                    parent.getChildren().add(right); 
                    setEntries(null); 
                    setChildren(null); 
                     
                    //更新根节点 
                    parent.updateInsert(tree); 
                } 
                 
 
            } 
             
        //如果不是叶子节点 
        }else { 
            //如果key小于等于节点最左边的key,沿第一个子节点继续搜索 
            if (key.compareTo(entries.get(0).getKey()) <= 0) { 
                children.get(0).insertOrUpdate(key, obj, tree); 
            //如果key大于节点最右边的key,沿最后一个子节点继续搜索 
            }else if (key.compareTo(entries.get(entries.size()-1).getKey()) >= 0) { 
                children.get(children.size()-1).insertOrUpdate(key, obj, tree); 
            //否则沿比key大的前一个子节点继续搜索 
            }else { 
                for (int i = 0; i < entries.size(); i++) { 
                    if (entries.get(i).getKey().compareTo(key) <= 0 && entries.get(i+1).getKey().compareTo(key) > 0) { 
                        children.get(i).insertOrUpdate(key, obj, tree); 
                        break; 
                    } 
                }    
            } 
        } 
    } 
     
    /** 插入节点后中间节点的更新 */ 
    protected void updateInsert(BplusTree tree){ 
 
        validate(this, tree); 
         
        //如果子节点数超出阶数,则需要分裂该节点    
        if (children.size() > tree.getOrder()) { 
            //分裂成左右两个节点 
            Node left = new Node(false); 
            Node right = new Node(false); 
            //左右两个节点关键字长度 
            int leftSize = (tree.getOrder() + 1) / 2 + (tree.getOrder() + 1) % 2; 
            int rightSize = (tree.getOrder() + 1) / 2; 
            //复制子节点到分裂出来的新节点,并更新关键字 
            for (int i = 0; i < leftSize; i++){ 
                left.getChildren().add(children.get(i)); 
                left.getEntries().add(new SimpleEntry(children.get(i).getEntries().get(0).getKey(), null)); 
                children.get(i).setParent(left); 
            } 
            for (int i = 0; i < rightSize; i++){ 
                right.getChildren().add(children.get(leftSize + i)); 
                right.getEntries().add(new SimpleEntry(children.get(leftSize + i).getEntries().get(0).getKey(), null)); 
                children.get(leftSize + i).setParent(right); 
            } 
             
            //如果不是根节点 
            if (parent != null) { 
                //调整父子节点关系 
                int index = parent.getChildren().indexOf(this); 
                parent.getChildren().remove(this); 
                left.setParent(parent); 
                right.setParent(parent); 
                parent.getChildren().add(index,left); 
                parent.getChildren().add(index + 1, right); 
                setEntries(null); 
                setChildren(null); 
                 
                //父节点更新关键字 
                parent.updateInsert(tree); 
                setParent(null); 
            //如果是根节点     
            }else { 
                isRoot = false; 
                Node parent = new Node(false, true); 
                tree.setRoot(parent); 
                left.setParent(parent); 
                right.setParent(parent); 
                parent.getChildren().add(left); 
                parent.getChildren().add(right); 
                setEntries(null); 
                setChildren(null); 
                 
                //更新根节点 
                parent.updateInsert(tree); 
            } 
        } 
    } 
     
    /** 调整节点关键字*/ 
    protected static void validate(Node node, BplusTree tree) { 
         
        // 如果关键字个数与子节点个数相同 
        if (node.getEntries().size() == node.getChildren().size()) { 
            for (int i = 0; i < node.getEntries().size(); i++) { 
                Comparable key = node.getChildren().get(i).getEntries().get(0).getKey(); 
                if (node.getEntries().get(i).getKey().compareTo(key) != 0) { 
                    node.getEntries().remove(i); 
                    node.getEntries().add(i, new SimpleEntry(key, null)); 
                    if(!node.isRoot()){ 
                        validate(node.getParent(), tree); 
                    } 
                } 
            } 
            // 如果子节点数不等于关键字个数但仍大于M / 2并且小于M,并且大于2 
        } else if (node.isRoot() && node.getChildren().size() >= 2  
                ||node.getChildren().size() >= tree.getOrder() / 2  
                && node.getChildren().size() <= tree.getOrder() 
                && node.getChildren().size() >= 2) { 
            node.getEntries().clear(); 
            for (int i = 0; i < node.getChildren().size(); i++) { 
                Comparable key = node.getChildren().get(i).getEntries().get(0).getKey(); 
                node.getEntries().add(new SimpleEntry(key, null)); 
                if (!node.isRoot()) { 
                    validate(node.getParent(), tree); 
                } 
            } 
        } 
    } 
     
    /** 删除节点后中间节点的更新*/ 
    protected void updateRemove(BplusTree tree) { 
         
        validate(this, tree); 
 
        // 如果子节点数小于M / 2或者小于2,则需要合并节点 
        if (children.size() < tree.getOrder() / 2 || children.size() < 2) { 
            if (isRoot) { 
                // 如果是根节点并且子节点数大于等于2,OK 
                if (children.size() >= 2) { 
                    return; 
                // 否则与子节点合并 
                } else { 
                    Node root = children.get(0); 
                    tree.setRoot(root); 
                    root.setParent(null); 
                    root.setRoot(true); 
                    setEntries(null); 
                    setChildren(null); 
                } 
            } else { 
                //计算前后节点  
                int currIdx = parent.getChildren().indexOf(this); 
                int prevIdx = currIdx - 1; 
                int nextIdx = currIdx + 1; 
                Node previous = null, next = null; 
                if (prevIdx >= 0) { 
                    previous = parent.getChildren().get(prevIdx); 
                } 
                if (nextIdx < parent.getChildren().size()) { 
                    next = parent.getChildren().get(nextIdx); 
                } 
                 
                // 如果前节点子节点数大于M / 2并且大于2,则从其处借补 
                if (previous != null  
                        && previous.getChildren().size() > tree.getOrder() / 2 
                        && previous.getChildren().size() > 2) { 
                    //前叶子节点末尾节点添加到首位 
                    int idx = previous.getChildren().size() - 1; 
                    Node borrow = previous.getChildren().get(idx); 
                    previous.getChildren().remove(idx); 
                    borrow.setParent(this); 
                    children.add(0, borrow); 
                    validate(previous, tree); 
                    validate(this, tree); 
                    parent.updateRemove(tree); 
                     
                // 如果后节点子节点数大于M / 2并且大于2,则从其处借补 
                } else if (next != null  
                        && next.getChildren().size() > tree.getOrder() / 2 
                        && next.getChildren().size() > 2) { 
                    //后叶子节点首位添加到末尾 
                    Node borrow = next.getChildren().get(0); 
                    next.getChildren().remove(0); 
                    borrow.setParent(this); 
                    children.add(borrow); 
                    validate(next, tree); 
                    validate(this, tree); 
                    parent.updateRemove(tree); 
                     
                // 否则需要合并节点 
                } else { 
                    // 同前面节点合并 
                    if (previous != null  
                            && (previous.getChildren().size() <= tree.getOrder() / 2 || previous.getChildren().size() <= 2)) { 
                         
                        for (int i = previous.getChildren().size() - 1; i >= 0; i--) { 
                            Node child = previous.getChildren().get(i); 
                            children.add(0, child); 
                            child.setParent(this); 
                        } 
                        previous.setChildren(null); 
                        previous.setEntries(null); 
                        previous.setParent(null); 
                        parent.getChildren().remove(previous); 
                        validate(this, tree); 
                        parent.updateRemove(tree); 
                         
                    // 同后面节点合并 
                    } else if (next != null  
                            && (next.getChildren().size() <= tree.getOrder() / 2 || next.getChildren().size() <= 2)) { 
 
                        for (int i = 0; i < next.getChildren().size(); i++) { 
                            Node child = next.getChildren().get(i); 
                            children.add(child); 
                            child.setParent(this); 
                        } 
                        next.setChildren(null); 
                        next.setEntries(null); 
                        next.setParent(null); 
                        parent.getChildren().remove(next); 
                        validate(this, tree); 
                        parent.updateRemove(tree); 
                    } 
                } 
            } 
        } 
    } 
     
    public void remove(Comparable key, BplusTree tree){ 
        //如果是叶子节点 
        if (isLeaf){ 
             
            //如果不包含该关键字,则直接返回 
            if (!contains(key)){ 
                return; 
            } 
             
            //如果既是叶子节点又是跟节点,直接删除 
            if (isRoot) { 
                remove(key); 
            }else { 
                //如果关键字数大于M / 2,直接删除 
                if (entries.size() > tree.getOrder() / 2 && entries.size() > 2) { 
                    remove(key); 
                }else { 
                    //如果自身关键字数小于M / 2,并且前节点关键字数大于M / 2,则从其处借补 
                    if (previous != null  
                            && previous.getEntries().size() > tree.getOrder() / 2 
                            && previous.getEntries().size() > 2 
                            && previous.getParent() == parent) { 
                        int size = previous.getEntries().size(); 
                        Entry<Comparable, Object> entry = previous.getEntries().get(size - 1); 
                        previous.getEntries().remove(entry); 
                        //添加到首位 
                        entries.add(0, entry); 
                        remove(key); 
                    //如果自身关键字数小于M / 2,并且后节点关键字数大于M / 2,则从其处借补    
                    }else if (next != null  
                            && next.getEntries().size() > tree.getOrder() / 2 
                            && next.getEntries().size() > 2 
                            && next.getParent() == parent) { 
                        Entry<Comparable, Object> entry = next.getEntries().get(0); 
                        next.getEntries().remove(entry); 
                        //添加到末尾 
                        entries.add(entry); 
                        remove(key); 
                    //否则需要合并叶子节点     
                    }else { 
                        //同前面节点合并 
                        if (previous != null  
                                && (previous.getEntries().size() <= tree.getOrder() / 2 || previous.getEntries().size() <= 2) 
                                && previous.getParent() == parent) { 
                            for (int i = previous.getEntries().size() - 1; i >=0; i--) { 
                                //从末尾开始添加到首位 
                                entries.add(0, previous.getEntries().get(i)); 
                            } 
                            remove(key); 
                            previous.setParent(null); 
                            previous.setEntries(null); 
                            parent.getChildren().remove(previous); 
                            //更新链表 
                            if (previous.getPrevious() != null) { 
                                Node temp = previous; 
                                temp.getPrevious().setNext(this); 
                                previous = temp.getPrevious(); 
                                temp.setPrevious(null); 
                                temp.setNext(null);                          
                            }else { 
                                tree.setHead(this); 
                                previous.setNext(null); 
                                previous = null; 
                            } 
                        //同后面节点合并    
                        }else if(next != null  
                                && (next.getEntries().size() <= tree.getOrder() / 2 || next.getEntries().size() <= 2) 
                                && next.getParent() == parent){ 
                            for (int i = 0; i < next.getEntries().size(); i++) { 
                                //从首位开始添加到末尾 
                                entries.add(next.getEntries().get(i)); 
                            } 
                            remove(key); 
                            next.setParent(null); 
                            next.setEntries(null); 
                            parent.getChildren().remove(next); 
                            //更新链表 
                            if (next.getNext() != null) { 
                                Node temp = next; 
                                temp.getNext().setPrevious(this); 
                                next = temp.getNext(); 
                                temp.setPrevious(null); 
                                temp.setNext(null); 
                            }else { 
                                next.setPrevious(null); 
                                next = null; 
                            } 
                        } 
                    } 
                } 
                parent.updateRemove(tree); 
            } 
        //如果不是叶子节点   
        }else { 
            //如果key小于等于节点最左边的key,沿第一个子节点继续搜索 
            if (key.compareTo(entries.get(0).getKey()) <= 0) { 
                children.get(0).remove(key, tree); 
            //如果key大于节点最右边的key,沿最后一个子节点继续搜索 
            }else if (key.compareTo(entries.get(entries.size()-1).getKey()) >= 0) { 
                children.get(children.size()-1).remove(key, tree); 
            //否则沿比key大的前一个子节点继续搜索 
            }else { 
                for (int i = 0; i < entries.size(); i++) { 
                    if (entries.get(i).getKey().compareTo(key) <= 0 && entries.get(i+1).getKey().compareTo(key) > 0) { 
                        children.get(i).remove(key, tree); 
                        break; 
                    } 
                }    
            } 
        } 
    } 
     
    /** 判断当前节点是否包含该关键字*/ 
    protected boolean contains(Comparable key) { 
        for (Entry<Comparable, Object> entry : entries) { 
            if (entry.getKey().compareTo(key) == 0) { 
                return true; 
            } 
        } 
        return false; 
    } 
     
    /** 插入到当前节点的关键字中*/ 
    protected void insertOrUpdate(Comparable key, Object obj){ 
        Entry<Comparable, Object> entry = new SimpleEntry<Comparable, Object>(key, obj); 
        //如果关键字列表长度为0,则直接插入 
        if (entries.size() == 0) { 
            entries.add(entry); 
            return; 
        } 
        //否则遍历列表 
        for (int i = 0; i < entries.size(); i++) { 
            //如果该关键字键值已存在,则更新 
            if (entries.get(i).getKey().compareTo(key) == 0) { 
                entries.get(i).setValue(obj); 
                return; 
            //否则插入   
            }else if (entries.get(i).getKey().compareTo(key) > 0){ 
                //插入到链首 
                if (i == 0) { 
                    entries.add(0, entry); 
                    return; 
                //插入到中间 
                }else { 
                    entries.add(i, entry); 
                    return; 
                } 
            } 
        } 
        //插入到末尾 
        entries.add(entries.size(), entry); 
    } 
     
    /** 删除节点*/ 
    protected void remove(Comparable key){ 
        int index = -1; 
        for (int i = 0; i < entries.size(); i++) { 
            if (entries.get(i).getKey().compareTo(key) == 0) { 
                index = i; 
                break; 
            } 
        } 
        if (index != -1) { 
            entries.remove(index); 
        } 
    } 
     
    public Node getPrevious() { 
        return previous; 
    } 
 
    public void setPrevious(Node previous) { 
        this.previous = previous; 
    } 
 
    public Node getNext() { 
        return next; 
    } 
 
    public void setNext(Node next) { 
        this.next = next; 
    } 
 
    public boolean isLeaf() { 
        return isLeaf; 
    } 
 
    public void setLeaf(boolean isLeaf) { 
        this.isLeaf = isLeaf; 
    } 
 
    public Node getParent() { 
        return parent; 
    } 
 
    public void setParent(Node parent) { 
        this.parent = parent; 
    } 
 
    public List<Entry<Comparable, Object>> getEntries() { 
        return entries; 
    } 
 
    public void setEntries(List<Entry<Comparable, Object>> entries) { 
        this.entries = entries; 
    } 
 
    public List<Node> getChildren() { 
        return children; 
    } 
 
    public void setChildren(List<Node> children) { 
        this.children = children; 
    } 
     
    public boolean isRoot() { 
        return isRoot; 
    } 
 
    public void setRoot(boolean isRoot) { 
        this.isRoot = isRoot; 
    } 
     
    public String toString(){ 
        StringBuilder sb = new StringBuilder(); 
        sb.append("isRoot: "); 
        sb.append(isRoot); 
        sb.append(", "); 
        sb.append("isLeaf: "); 
        sb.append(isLeaf); 
        sb.append(", "); 
        sb.append("keys: "); 
        for (Entry entry : entries){ 
            sb.append(entry.getKey()); 
            sb.append(", "); 
        } 
        sb.append(", "); 
        return sb.toString(); 
         
    } 
 
}
 

 

分享到:
评论

相关推荐

    数据结构学习笔记——使用draw.io绘制的树结构图

    树结构 draw.io图 二叉树、顺序树、树的链式存储结构、树的数组存储结构、欧拉树 绘图软件为免费开源软件draw.io

    数据结构学习笔记.zip

    笔记:详细且系统的笔记,涵盖了数据结构的各个方面,从基础概念到复杂的数据结构如堆、B树等。这些笔记有助于你系统地复习和学习数据结构。 相关书籍推荐:为了更深入地理解数据结构,我们推荐了几本经典的教材和...

    数据结构(C语言描述)学习笔记.zip

    笔记:详细且系统的笔记,涵盖了数据结构的各个方面,从基础概念到复杂的数据结构如堆、B树等。这些笔记有助于你系统地复习和学习数据结构。 相关书籍推荐:为了更深入地理解数据结构,我们推荐了几本经典的教材和...

    小码哥《恋上数据结构与算法》学习笔记.zip

    笔记:详细且系统的笔记,涵盖了数据结构的各个方面,从基础概念到复杂的数据结构如堆、B树等。这些笔记有助于你系统地复习和学习数据结构。 相关书籍推荐:为了更深入地理解数据结构,我们推荐了几本经典的教材和...

    数据结构算法学习笔记.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...

    数据结构与算法学习笔记.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...

    算法和数据结构学习笔记.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...

    数据结构与算法的学习笔记.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...

    数据结构与算法-学习笔记 Java 版.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...

    Data Structures and Algorithms 数据结构与算法学习笔记.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...

    学习笔记(04):MySQL版SQL优化-SQL解析过程、索引、B树

    立即学习:https://edu.csdn.net/course/play/25283/297140?utm_source=blogtoedu SQL优化: 原因:性能低、执行时间太长、 等待时间太长、SQL语句欠佳(连接查询)、索引失效、服务器参数设置不合理(缓冲、线程数)...

    学习笔记(07):Python零基础轻松从入门到实战-列表-2

    立即学习:https://edu.csdn.net/course/play/26676/338778?utm_source=blogtoedu 列表的方法 dir(list) 查询列表的所有方法 1、增加 lst.append 在lst末尾追加对象 ...lst.remove(‘b’) 删除第一个值

    Java 学习笔记,包括多线程,数据结构,算法,设计模式,Spring boot,RocketMQ.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...

    完整学习笔记:《剑指offer》Java版代码实现

    第十八题 判断二叉树A中是否包含子树B 测试18 第十九题 二叉树的镜像 测试19 第二十题 顺时针打印矩阵 测试20 第二十一题 包含min函数的栈 测试21 第二十二题 判断一个栈是否是另一个栈的弹出序列 测试22 第三十三题...

    机器视觉笔记第四章

    本人再看B站上机器视觉入门教程时做的笔记,这份文档是第四章的内容,希望有帮助。编程环境是基于jupyter notebook

    整理后java开发全套达内学习笔记(含练习)

    abstract (关键字) 抽象 ['æbstrækt] access vt.访问,存取 ['ækses]'(n.入口,使用权) algorithm n....Annotation [java] 代码注释 [ænәu'teiʃәn] anonymous adj.匿名的[ә'nɒnimәs]'(反义:directly adv....

    DataStructure-BeautyOfAlgorithm:《数据结构与算法之美》的学习笔记和python代码实现

    本文档是的学习笔记和个人编写的python实现的相关代码。在线阅读地址:如果本文档对您有用,期待您点击右上角Star :star: 给予关注!谢谢拉!还可以分享给您身边更多的小伙伴!:face_blowing_a_kiss:若你有什么更好...

    MySQL学习笔记(2)——索引

    文章目录索引简介是什么:目的:缺点:索引分类单值索引:唯一索引:复合索引:索引性能分析(explain)索引优化单表...帮助MySQL高效获取数据的数据结构(B树结构) 目的: 1、提高查询效率 2、为字段排序 缺点: 降低了i

    leetcode卡-algorithm_notes:算法学习笔记

    leetcode卡 Algorithm Notes 教程 Leetcode: 算法小结: ...B+树 哈希表 排序算法 希尔排序 简单排序 归并排序 基数排序 内部排序 堆排序 插入算法 折半插入算法 二路插入 表插入 动态规划: 最长递增子序列

    浙江大学《数据结构》上课笔记 + 数据结构实现 + 课后题题解.zip

    笔记:详细且系统的笔记,涵盖了数据结构的各个方面,从基础概念到复杂的数据结构如堆、B树等。这些笔记有助于你系统地复习和学习数据结构。 相关书籍推荐:为了更深入地理解数据结构,我们推荐了几本经典的教材和...

Global site tag (gtag.js) - Google Analytics