宁夏建设投资集团公司网站哪家网站开发公司好
宁夏建设投资集团公司网站,哪家网站开发公司好,北京网站建设排行榜,如何给喜欢的明星做网站AVL树----java AVL树是高度平衡的二叉查找树 1.单旋转LL旋转 理解记忆#xff1a;1.在不平衡的节点的左孩子的左孩子插入导致的不平衡#xff0c;所以叫LL private AVLTreeNodeT leftLeftRotation(AVLTreeNodeT k2) {AVLTreeNodeT k1;k1 k2.left;k2… AVL树----java AVL树是高度平衡的二叉查找树 1.单旋转LL旋转 理解记忆1.在不平衡的节点的左孩子的左孩子插入导致的不平衡所以叫LL private AVLTreeNodeT leftLeftRotation(AVLTreeNodeT k2) {AVLTreeNodeT k1;k1 k2.left;k2.left k1.right;k1.right k2;k2.height max( height(k2.left), height(k2.right)) 1;k1.height max( height(k1.left), k2.height) 1;return k1;
}2.单旋转RR 理解记忆1.不平衡节点的右孩子的有孩子插入导致的不平衡所以叫RR private AVLTreeNodeT rightRightRotation(AVLTreeNodeT k1) {AVLTreeNodeT k2;k2 k1.right;k1.right k2.left;k2.left k1;k1.height max( height(k1.left), height(k1.right)) 1;k2.height max( height(k2.right), k1.height) 1;return k2;
}3.双旋转LR 理解记忆1.不平衡节点的左孩子的有孩子导致的不平衡所以叫LR 2.须要先对k1 RR,再对根K3 LL private AVLTreeNodeT leftRightRotation(AVLTreeNodeT k3) {k3.left rightRightRotation(k3.left);return leftLeftRotation(k3);
}
4.双旋转RL 理解记忆1.不平衡节点的右孩子的左孩子导致的不平衡所以叫RL 2.须要先对k3 LL,在对k1 RR private AVLTreeNodeT rightLeftRotation(AVLTreeNodeT k1) {k1.right leftLeftRotation(k1.right);return rightRightRotation(k1);
}5.AVL的样例 遍历查找等和二叉查找树一样就不在列出主要是 插入 和 删除
public class AVLTreeT extends ComparableT {private AVLTreeNodeT mRoot; // 根结点// AVL树的节点(内部类)class AVLTreeNodeT extends ComparableT {T key; // keyword(键值)int height; // 高度AVLTreeNodeT left; // 左孩子AVLTreeNodeT right; // 右孩子public AVLTreeNode(T key, AVLTreeNodeT left, AVLTreeNodeT right) {this.key key;this.left left;this.right right;this.height 0;}}// 构造函数public AVLTree() {mRoot null;}/** 获取树的高度*/private int height(AVLTreeNodeT tree) {if (tree ! null)return tree.height;return 0;}public int height() {return height(mRoot);}/** 比較两个值的大小*/private int max(int a, int b) {return ab ? a : b;}/** 前序遍历AVL树*/private void preOrder(AVLTreeNodeT tree) {if(tree ! null) {System.out.print(tree.key );preOrder(tree.left);preOrder(tree.right);}}public void preOrder() {preOrder(mRoot);}/** 中序遍历AVL树*/private void inOrder(AVLTreeNodeT tree) {if(tree ! null){inOrder(tree.left);System.out.print(tree.key );inOrder(tree.right);}}public void inOrder() {inOrder(mRoot);}/** 后序遍历AVL树*/private void postOrder(AVLTreeNodeT tree) {if(tree ! null) {postOrder(tree.left);postOrder(tree.right);System.out.print(tree.key );}}public void postOrder() {postOrder(mRoot);}/** (递归实现)查找AVL树x中键值为key的节点*/private AVLTreeNodeT search(AVLTreeNodeT x, T key) {if (xnull)return x;int cmp key.compareTo(x.key);if (cmp 0)return search(x.left, key);else if (cmp 0)return search(x.right, key);elsereturn x;}public AVLTreeNodeT search(T key) {return search(mRoot, key);}/** (非递归实现)查找AVL树x中键值为key的节点*/private AVLTreeNodeT iterativeSearch(AVLTreeNodeT x, T key) {while (x!null) {int cmp key.compareTo(x.key);if (cmp 0)x x.left;else if (cmp 0)x x.right;elsereturn x;}return x;}public AVLTreeNodeT iterativeSearch(T key) {return iterativeSearch(mRoot, key);}/* * 查找最小结点返回tree为根结点的AVL树的最小结点。*/private AVLTreeNodeT minimum(AVLTreeNodeT tree) {if (tree null)return null;while(tree.left ! null)tree tree.left;return tree;}public T minimum() {AVLTreeNodeT p minimum(mRoot);if (p ! null)return p.key;return null;}/* * 查找最大结点返回tree为根结点的AVL树的最大结点。*/private AVLTreeNodeT maximum(AVLTreeNodeT tree) {if (tree null)return null;while(tree.right ! null)tree tree.right;return tree;}public T maximum() {AVLTreeNodeT p maximum(mRoot);if (p ! null)return p.key;return null;}/** LL左左相应的情况(左单旋转)。** 返回值旋转后的根节点*/private AVLTreeNodeT leftLeftRotation(AVLTreeNodeT k2) {AVLTreeNodeT k1;k1 k2.left;k2.left k1.right;k1.right k2;k2.height max( height(k2.left), height(k2.right)) 1;k1.height max( height(k1.left), k2.height) 1;return k1;}/** RR右右相应的情况(右单旋转)。** 返回值旋转后的根节点*/private AVLTreeNodeT rightRightRotation(AVLTreeNodeT k1) {AVLTreeNodeT k2;k2 k1.right;k1.right k2.left;k2.left k1;k1.height max( height(k1.left), height(k1.right)) 1;k2.height max( height(k2.right), k1.height) 1;return k2;}/** LR左右相应的情况(左双旋转)。** 返回值旋转后的根节点*/private AVLTreeNodeT leftRightRotation(AVLTreeNodeT k3) {k3.left rightRightRotation(k3.left);return leftLeftRotation(k3);}/** RL右左相应的情况(右双旋转)。** 返回值旋转后的根节点*/private AVLTreeNodeT rightLeftRotation(AVLTreeNodeT k1) {k1.right leftLeftRotation(k1.right);return rightRightRotation(k1);}/* * 将结点插入到AVL树中并返回根节点** 參数说明* tree AVL树的根结点* key 插入的结点的键值* 返回值* 根节点*/private AVLTreeNodeT insert(AVLTreeNodeT tree, T key) {if (tree null) {// 新建节点tree new AVLTreeNodeT(key, null, null);if (treenull) {System.out.println(ERROR: create avltree node failed!);return null;}} else {int cmp key.compareTo(tree.key);if (cmp 0) { // 应该将key插入到tree的左子树的情况tree.left insert(tree.left, key);// 插入节点后若AVL树失去平衡则进行相应的调节。if (height(tree.left) - height(tree.right) 2) {if (key.compareTo(tree.left.key) 0)tree leftLeftRotation(tree);elsetree leftRightRotation(tree);}} else if (cmp 0) { // 应该将key插入到tree的右子树的情况tree.right insert(tree.right, key);// 插入节点后若AVL树失去平衡则进行相应的调节。if (height(tree.right) - height(tree.left) 2) {if (key.compareTo(tree.right.key) 0)tree rightRightRotation(tree);elsetree rightLeftRotation(tree);}} else { // cmp0System.out.println(加入失败不同意加入同样的节点);}}tree.height max( height(tree.left), height(tree.right)) 1;return tree;}public void insert(T key) {mRoot insert(mRoot, key);}/* * 删除结点(z)返回根节点** 參数说明* tree AVL树的根结点* z 待删除的结点* 返回值* 根节点*/private AVLTreeNodeT remove(AVLTreeNodeT tree, AVLTreeNodeT z) {// 根为空 或者 没有要删除的节点直接返回null。if (treenull || znull)return null;int cmp z.key.compareTo(tree.key);if (cmp 0) { // 待删除的节点在tree的左子树中tree.left remove(tree.left, z);// 删除节点后若AVL树失去平衡则进行相应的调节。if (height(tree.right) - height(tree.left) 2) {AVLTreeNodeT r tree.right;if (height(r.left) height(r.right))tree rightLeftRotation(tree);elsetree rightRightRotation(tree);}} else if (cmp 0) { // 待删除的节点在tree的右子树中tree.right remove(tree.right, z);// 删除节点后若AVL树失去平衡则进行相应的调节。if (height(tree.left) - height(tree.right) 2) {AVLTreeNodeT l tree.left;if (height(l.right) height(l.left))tree leftRightRotation(tree);elsetree leftLeftRotation(tree);}} else { // tree是相应要删除的节点。// tree的左右孩子都非空if ((tree.left!null) (tree.right!null)) {if (height(tree.left) height(tree.right)) {// 假设tree的左子树比右子树高// 则(01)找出tree的左子树中的最大节点// (02)将该最大节点的值赋值给tree。// (03)删除该最大节点。// 这相似于用tree的左子树中最大节点做tree的替身// 採用这样的方式的优点是删除tree的左子树中最大节点之后AVL树仍然是平衡的。AVLTreeNodeT max maximum(tree.left);tree.key max.key;tree.left remove(tree.left, max);} else {// 假设tree的左子树不比右子树高(即它们相等或右子树比左子树高1)// 则(01)找出tree的右子树中的最小节点// (02)将该最小节点的值赋值给tree。// (03)删除该最小节点。// 这相似于用tree的右子树中最小节点做tree的替身// 採用这样的方式的优点是删除tree的右子树中最小节点之后AVL树仍然是平衡的。AVLTreeNodeT min maximum(tree.right);tree.key min.key;tree.right remove(tree.right, min);}} else {AVLTreeNodeT tmp tree;tree (tree.left!null) ? tree.left : tree.right;tmp null;}}return tree;}public void remove(T key) {AVLTreeNodeT z; if ((z search(mRoot, key)) ! null)mRoot remove(mRoot, z);}/* * 销毁AVL树*/private void destroy(AVLTreeNodeT tree) {if (treenull)return ;if (tree.left ! null)destroy(tree.left);if (tree.right ! null)destroy(tree.right);tree null;}public void destroy() {destroy(mRoot);}/** 打印二叉查找树** key -- 节点的键值 * direction -- 0表示该节点是根节点;* -1表示该节点是它的父结点的左孩子;* 1表示该节点是它的父结点的右孩子。*/private void print(AVLTreeNodeT tree, T key, int direction) {if(tree ! null) {if(direction0) // tree是根节点System.out.printf(%2d is root\n, tree.key, key);else // tree是分支节点System.out.printf(%2d is %2ds %6s child\n, tree.key, key, direction1?right : left);print(tree.left, tree.key, -1);print(tree.right,tree.key, 1);}}public void print() {if (mRoot ! null)print(mRoot, mRoot.key, 0);}
} 文章大量參考http://www.cnblogs.com/skywang12345/p/3577479.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88714.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!