二叉排序树
public class Demo{
public static void main(String[] args){
int[] arr = {1,4,5,6,8,9,3};
BinarySortTree binarySortTree = new BinarySortTree();
for(int i=0;i<arr.lengthli++){
binarySortTree.add(new Node(arr[i]));
}
binarySortTree.infixOrder();
}
}
class BinarySortTree{
private Node root;
public void add(Node node){
if(root==null){
root = node;
}else{
root.add(node);
}
}
public void infixOrder(){
if(root!=null){
root.infixOrder();
}else{
}
}
}
class Node{
int value;
Node left;
Node right;
public Node(int value){
this.value = value;
}
public void add(Node node){
if(node==null){
return;
}
if(node.value < this.value){
if(this.left == null){
this.left = node;
}else{
this.left.add(node);
}
}else{
if(this.right==null){
this.right=node;
}else{
this.right.add(node);
}
}
}
public void infixOrder(){
if(this.left!=null){
this.left.infixOrder();
}
System.out.println(this);
if(this.right!=null){
this.right.infixOrder();
}
}
}
删除
class BinarySortTree{
private Node root;
public Node search(int value){
if(root==null){
return null;
}else{
return root.search(value);
}
}
public Node searchParent(int value){
if(root==null){
return null;
}else{
return root.searchParent(value);
}
}
public int delRightTreeMin(Node node){
Node target = node;
while(target.left !=null){
target = target.left;
}
delNode(target.value);
return target.value
}
public void delNode(int value){
if(root == null){
return;
}else{
Node targetNode =search(value);
if(tarhetNode==null){
return;
}
if(root.left==null&&root.right==null){
root = null;
return;
}
Node parent = searchParent(value);
if(targetNode.left == null && targetNode.right == null){
if(parent.left ! = null && parent/left.value==value){
parent.left = null;
}else if(parent.right!=null && parent.right.value==value){
parent.right = null;
}
}else if(targetNode.left!=null&&targetNode.right!=null){
int minVal = delRightTree(target.right);
targetNode.value = minVal;
}else{
if(targetNode.left!=null){
if(parent!=null){
if(parent.left.value == value){
parent.left = targetNode.left;
}else{
parent.right = targetNode.left;
}
}else{
root = targetNode.left;
}
}else{
if(parent!=null){
if(parent.left.value==value){
parent.left = targetNode.right;
}else{
parent.right = targetNode.right;
}
}else{
root = targetNode.right;
}
}
}
}
}
public void add(Node node){
if(root==null){
root = node;
}else{
root.add(node);
}
}
public void infixOrder(){
if(root!=null){
root.infixOrder();
}else{
}
}
}
class Node{
int value;
Node left;
Node right;
public Node(int value){
this.value = value;
}
public Node search(int value){
if(value==this.value){
return this;
}else if(value<this.value){
if(this.left==null){
return null;
}
return this.left.search(value);
}else if(){
if(this.right==null){
return null;
}
return this.right.search(value);
}
}
public Node searchParent(int value){
if(this.left!=null&&this.left.value==value || this.right!=null&&this.right.value==value){
return this;
}else{
if(value<this.value&&this.left!=null){
return this.left.searchParent(value);
}else if(value>=this.value&&this.right!=null){
return this.right.searchParent(value);
}else{
return null;
}
}
}
public void add(Node node){
if(node==null){
return;
}
if(node.value < this.value){
if(this.left == null){
this.left = node;
}else{
this.left.add(node);
}
}else{
if(this.right==null){
this.right=node;
}else{
this.right.add(node);
}
}
}
public void infixOrder(){
if(this.left!=null){
this.left.infixOrder();
}
System.out.println(this);
if(this.right!=null){
this.right.infixOrder();
}
}
}
平衡二叉树(AVL树)
public class Demo{
public static void main(String[] args){
int[] arr = {4,3,6,5,7,8};
AVLTree avlTree = new AVLTree();
for(int i=0;i<arr.length;i++){
avlTree.add(new Node(i));
}
avlTree.infixOrder();
}
}
class AVLTree{
public void add(){
}
public void infixOrder(){
}
}
class Node{
int value;
Node left;
Node right;
public Node(int value){
this.value = value;
}
public int leftHeight(){
if(left == null){
return 0;
}
return left.height();
}
public int rightHeight(){
if(right==null){
return 0;
}
return right.height();
}
public int height(){
return Math.max(left==null?0:left.height(),right==null?0:right.height())+1
}
private void leftRotate(){
Node newNode = new Node(value);
newNode.left = left;
newNode.right = right.left;
value = right.value;
right = right.right;
left = newNode;
}
private void rightRotate(){
Node newNode = new Node(value);
newNode.right = right;
newNode.left = left.right;
value = left.value;
left = left.left;
right = newNode;
}
public void infixOrder(){
if(this.left!=null){
this.left.infixOrder();
}
System.out.println(this);
if(this.right!=null){
this.right.infixOrder();
}
}
public void add(Node node){
if(node==null){
return;
}
if(node.value < this.value){
if(this.left == null){
this.left = node;
}else{
this.left.add(node);
}
}else{
if(this.right==null){
this.right=node;
}else{
this.right.add(node);
}
}
if(rightHeight()-leftHeight()>1){
if(right!=null && right.leftHeightx()>right.rightHeight()){
left.rightRotate();
leftRotate();
}else{
leftRotate();
}
return;
}
if(leftHeight()-rightHeight()>1){
if(left!=null && left.rightHeight()>left.leftHeight()){
left.leftRotate();
rightRotate();
}else{
rightRotate();
}
}
}
}