平衡二叉树 java_树——平衡二叉树插入和查找的JAVA实现

packagecom.tomsnail.data.tree;/*** AVL二叉平衡树

*@authortomsnail

* @date 2015年3月30日 下午4:35:50*/

public classAVLTree {/*** 根节点

*@authortomsnail

* @date 2015年3月30日 下午4:36:54*/

privateAVLNode rootNode;private String bulidType = "";/*** 增加一个节点

*@authortomsnail

* @date 2015年3月30日 下午4:36:08*/

public void add(intvalue){

AVLNode subNode= null;if(rootNode==null){

subNode= newAVLNode(value);

rootNode=subNode;

}else{

subNode=addNode(rootNode,value);

}

reBuild(subNode);

}private AVLNode addNode(AVLNode node,intvalue){

AVLNode subNode= null;if(node.getValue()>value){if(node.getLeftNode()==null){

subNode= newAVLNode(value);

node.setLeftNode(subNode);

}else{

subNode=addNode(node.getLeftNode(), value);

}

}if(node.getValue()

subNode= newAVLNode(value);

node.setRightNode(subNode);

}else{

subNode=addNode(node.getRightNode(),value);

}

}returnsubNode;

}/*** 重平衡树

*@authortomsnail

* @date 2015年3月30日 下午5:42:00*/

private voidreBuild(AVLNode node){if(node!=null){

AVLNode tempRootNode=findTempRootNode(node);if(tempRootNode!=null){if(bulidType.equals("ll")){

Lrotate(node,tempRootNode);

}else if(bulidType.equals("rr")){

Rrotate(node,tempRootNode);

}else if(bulidType.equals("lr")){

Rrotate(node,tempRootNode.getLeftNode());

Lrotate(node,tempRootNode);

}else if(bulidType.equals("rl")){

Lrotate(node,tempRootNode.getRightNode());

Rrotate(node,tempRootNode);

}

}

}

}/*** 左旋

*@authortomsnail

* @date 2015年3月30日 下午9:23:28*/

private voidRrotate(AVLNode node,AVLNode tempRootNode){

AVLNode rotateNode=tempRootNode.getRightNode();

AVLNode rootNode=tempRootNode.getRootNode();

String type= "";if(rootNode!=null){if(rootNode.getLeftNode()==tempRootNode){

type="l";

}else{

type="r";

}

}

AVLNode adjustNode=rotateNode.getLeftNode();

rotateNode.setLeftNode(tempRootNode);

tempRootNode.setRightNode(null);if(adjustNode!=null){

tempRootNode.setRightNode(adjustNode);

}if(rootNode==null){

rotateNode.setRootNode(null);this.rootNode =rotateNode;

}if(type.equals("r")){

rootNode.setRightNode(rotateNode);

}else if(type.equals("l")){

rootNode.setLeftNode(rotateNode);

}

}/*** 右旋

*@authortomsnail

* @date 2015年3月30日 下午9:23:28*/

private voidLrotate(AVLNode node,AVLNode tempRootNode){

AVLNode rotateNode=tempRootNode.getLeftNode();

AVLNode rootNode=tempRootNode.getRootNode();

String type= "";if(rootNode!=null){if(rootNode.getLeftNode()==tempRootNode){

type="l";

}else{

type="r";

}

}

AVLNode adjustNode=rotateNode.getRightNode();

rotateNode.setRightNode(tempRootNode);

tempRootNode.setLeftNode(null);if(adjustNode!=null){

tempRootNode.setLeftNode(adjustNode);

}if(rootNode==null){

rotateNode.setRootNode(null);this.rootNode =rotateNode;

}if(type.equals("r")){

rootNode.setRightNode(rotateNode);

}else if(type.equals("l")){

rootNode.setLeftNode(rotateNode);

}

}/*** 查找最小不平衡的根节点

*@authortomsnail

* @date 2015年3月30日 下午5:40:55*/

privateAVLNode findTempRootNode(AVLNode node){

AVLNode noB=getNoBalance(node);if(noB==null){return null;

}if(isTypeLL(noB)){

bulidType= "ll";

}else if(isTypeRR(noB)){

bulidType= "rr";

}else if(isTypeLR(noB)){

bulidType= "lr";

}else if(isTypeRL(noB)){

bulidType= "rl";

}returnnoB;

}private booleanisTypeLL(AVLNode noB){try{if(noB.getRightNode()==null&&noB.getLeftNode().getRightNode()==null&&!noB.getLeftNode().getLeftNode().hasSubNode()){return true;

}if(noB.getRightNode()!=null&&noB.getLeftNode().getRightNode()!=null&&noB.getLeftNode().getLeftNode().hasSubNode()){return true;

}

}catch(Exception e) {

}return false;

}private booleanisTypeRR(AVLNode noB){try{if(noB.getLeftNode()==null&&noB.getRightNode().getLeftNode()==null&&!noB.getRightNode().getRightNode().hasSubNode()){return true;

}if(noB.getLeftNode()!=null&&noB.getRightNode().getLeftNode()!=null&&noB.getRightNode().getRightNode().hasSubNode()){return true;

}

}catch(Exception e) {

}return false;

}private booleanisTypeLR(AVLNode noB){try{if(noB.getRightNode()==null&&noB.getLeftNode().getLeftNode()==null&&!noB.getLeftNode().getRightNode().hasSubNode()){return true;

}if(noB.getRightNode()!=null&&noB.getLeftNode().getLeftNode()!=null&&noB.getLeftNode().getRightNode().hasSubNode()){return true;

}

}catch(Exception e) {

}return false;

}private booleanisTypeRL(AVLNode noB){try{if(noB.getLeftNode()==null&&noB.getRightNode().getRightNode()==null&&!noB.getRightNode().getLeftNode().hasSubNode()){return true;

}if(noB.getLeftNode()!=null&&noB.getRightNode().getRightNode()!=null&&noB.getRightNode().getLeftNode().hasSubNode()){return true;

}

}catch(Exception e) {

}return false;

}privateAVLNode getNoBalance(AVLNode node){if(node.getRootNode()==null){return null;

}else{if(!isBalance(node.getRootNode())){returnnode.getRootNode();

}else{returngetNoBalance(node.getRootNode());

}

}

}/*** 查找一个节点

*@authortomsnail

* @date 2015年3月30日 下午4:36:35*/

public AVLNode find(intvalue){returnfindWith2(rootNode,value);

}private AVLNode findWith2(AVLNode node,intvalue){if(node==null){return null;

}

System.out.println(node.getValue());if(node.getValue()>value){returnfindWith2(node.getLeftNode(),value);

}else if(node.getValue()

}else{returnnode;

}

}public voidmidScan(AVLNode node){if(node==null){return;

}

midScan(node.getLeftNode());

System.out.println(node.getValue());

midScan(node.getRightNode());

}publicAVLNode getRootNode() {returnrootNode;

}public static voidmain(String[] args) {int[] is = new int[]{10,11,23,3,5,44,32,4,6,18,19,7,8,70,50,60,40,55,65,53,80};//10,11,23,3,5,44,32,4,6,18,19,7,8,70,50,60,40,55,65,53,80

AVLTree tree = newAVLTree();for(int i=0;i

tree.add(is[i]);

}

System.out.println(tree.getRootNode().getValue());

System.out.println("----------------------------");

tree.midScan(tree.getRootNode());

System.out.println(isBalance(tree.getRootNode()));

}public static intdepth(AVLNode node){if(node==null){return 0;

}else{int ld =depth(node.getLeftNode());int rd =depth(node.getRightNode());return 1 + (ld >rd ?ld : rd);

}

}public static booleanisBalance(AVLNode node){if (node==null)return true;int dis = depth(node.getLeftNode()) -depth(node.getRightNode());if (dis>1 || dis

return isBalance(node.getLeftNode()) &&isBalance(node.getRightNode());

}

}classAVLNode{private intvalue;privateAVLNode leftNode;privateAVLNode rightNode;privateAVLNode rootNode;public intgetValue() {returnvalue;

}public void setValue(intvalue) {this.value =value;

}publicAVLNode getLeftNode() {returnleftNode;

}public voidsetLeftNode(AVLNode leftNode) {this.leftNode =leftNode;if(leftNode!=null){

leftNode.setRootNode(this);

}

}publicAVLNode getRightNode() {returnrightNode;

}public voidsetRightNode(AVLNode rightNode) {this.rightNode =rightNode;if(rightNode!=null){

rightNode.setRootNode(this);

}

}publicAVLNode getRootNode() {returnrootNode;

}public voidsetRootNode(AVLNode rootNode) {this.rootNode =rootNode;

}public booleanhasSubNode(){if(this.leftNode!=null||this.rightNode!=null){return true;

}else{return false;

}

}publicAVLNode(){

}public AVLNode(intvalue){this.value =value;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值