二叉排序树1

二叉排序树的建立
二叉排序树的定义与描述:

  • 若它的左子树非空,则左子树上所有的结点的值均小于根节点的值;
  • 若它的右子树非空,则右子树上所有结点的值均大于或等于根节点的值;
  • 它的左右子树也分别为二叉排序树。这是一个递归定义。
    数据的表示
  • 嵌套定义一个私有类来表示二叉查找树上的一个结点。
  • 每个结点都含有一个键、一个值、一条左链接、一条右链接、和一个结点计数器

二叉排序树的构造:

private Node root;
	private class Node{
		//键
		private Key key;
		//值
		private Value val;
		//指向子树的链接
		private Node left, right;
		//以该结点为根的子树的节点总数
		private int N;
		public Node(Key key, Value val, int N) {
			this.key = key;
			this.val = val;
			this.N = N ;
		}

查找:

		//在以x为根节点的子树中查找并返回key所对应的值
		//找不到返回空
private Value get(Node x, Key key) {
			if(x == null ) {
				return null;
			}
			int cmp = key.compareTo(x.key);
			if(cmp < 0) {
				return get(x.left, key);
			}else if(cmp > 0) {
				return get(x.right, key);
			}else {
				return x.val;
			}
		}

插入:

//如果key存在与以x为结点的子树中则更新它的值
//否则将以key和val为键值对的新节点插入到该子树中;
private Node put(Node x, Key key, Value val) {
			if( x == null) {
				return new Node(key, val, 1);
			}
			int cmp = key.compareTo(x.key);
			if(cmp < 0) {
				x.left = put(x.left, key, val);
			}else if(cmp > 0) {
				x.right = put(x.right, key,val);
			}else {
				x.val = val;
			}
			x.N = size(x.left) + size(x.right) + 1;
			return x;

		}

本文参考自《算法(第四版)》韦恩
代码链接

猜你喜欢

转载自blog.csdn.net/qq_40265485/article/details/86616839