排序二叉樹的性質:
java
若是左子樹不爲空,則左子樹上的點都小於根節點。node
若是右子樹不爲空,則右子樹上的點都大於根節點。this
根節點的左子樹和右子樹都是二叉排序樹spa
排序二叉樹的添加操做
code
從根節點開始,做爲當前節點排序
那當前節點與插入節點的值進行比較
圖片若比當前節點大,把當前節點的右子節點做爲當前結點,比當前節點的小,將左節點做爲當前節點進行比較get
重複2,3步驟直到找到合適的葉子結點class
若比葉子節點大,就插到葉子結點的右子節點,反之插到左子節點二叉樹
排序二叉樹的刪除操做的狀況有下面四種
無子節點,直接刪除
只有左子樹或左節點,將刪除節點的左節點做爲根節點便可
只有右子樹或右節點,將刪除節點的右子節點做爲根節點
即有右子樹,又有左子樹,這種狀況爲了方便本身記憶,我是隻採起一種方法,就是採起該刪除節點的前驅節點或後繼節,來補刪除節點的位置。(前驅節點就是比刪除節點全部小的節點中裏面最大的值,後繼節點就是比刪除節點都大的節點中的最小點)(2 7 8 10 15 17)例如刪除節點是10,則前驅就是8,後繼就是15
如圖片上的,刪除20這個點,能夠用前驅15或後繼30來做爲補位的節點
public class BinarySortTree { public static class Node { private int data; private String name; private Node leftNode; private Node rightNode; private Node parent; public Node(int data, Node parentNode) { super(); this.data = data; this.parent = this.parent; } public Node(int data, String name) { super(); this.data = data; this.name = name; } public Node(int data) { super(); this.data = data; } public Node() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getData() { return data; } public void setData(int data) { this.data = data; } public Node getLeftNode() { return leftNode; } public void setLeftNode(Node leftNode) { this.leftNode = leftNode; } public Node getRightNode() { return rightNode; } public void setRightNode(Node rightNode) { this.rightNode = rightNode; } public Node getParent() { return parent; } public void setParent(Node parent) { this.parent = parent; } } private Node root; public Node addNode(Node node){ if(root==null){ root=node; }else{ Node parent=getNodeIndex(root, node.getData()); node.parent=parent; if(parent.getData()>node.getData()){ parent.leftNode=node; }else{ parent.rightNode=node; } } return root; } private Node getNodeIndex(Node node,int data){ if(data>=node.getData()){ if(node.getRightNode()==null){ return node; }else{ return getNodeIndex(node.rightNode, data); } }else { if(node.getLeftNode()==null){ return node; }else{ return getNodeIndex(node.leftNode, data); } } } //廣度遍歷 public void breadth(){ Queue<Node> queue=new ArrayDeque<>(); if(root!=null){ queue.add(root); while(!queue.isEmpty()){ Node node=queue.poll(); if(node.leftNode!=null) queue.add(node.leftNode); if(node.rightNode!=null) queue.add(node.rightNode); System.out.print(node.getData()+"-"); } } } //中序遍歷 public void middle(){ if(root!=null){ pMiddle(root); } } private void pMiddle(Node node){ if(node!=null){ if(node.leftNode!=null) { pMiddle(node.leftNode); } System.out.println(node.getData()); if(node.rightNode!=null){ pMiddle(node.rightNode); } } } public void delete(int data){ if(root!=null){ Node node=search(root, data); if(node.leftNode==null&node.rightNode==null){ Node parentNode=node.parent; if(parentNode.leftNode.getData()==data){ parentNode.leftNode=null; }else { parentNode.rightNode=null; } } if(node.leftNode==null){ Node parentNode=node.parent; if(parentNode.leftNode.getData()==data){ parentNode.leftNode=node.rightNode; }else { parentNode.rightNode=node.rightNode; } } if(node.rightNode==null){ Node parenNode=node.parent; if(parenNode.leftNode.getData()==data){ parenNode.leftNode=node.leftNode; }else{ parenNode.rightNode=node.leftNode; } } //既有右子樹,又有作子樹 if(node.rightNode!=null&node.leftNode!=null){ Node preNode=findPreNode(node); Node preParentNode=preNode.parent; if(preParentNode.leftNode.getData()==preNode.getData()){ preParentNode.leftNode=null; }else{ preParentNode.rightNode=null; } preNode.rightNode=node.rightNode; node.rightNode.parent=preNode; preNode.leftNode=node.leftNode; node.leftNode.parent=preNode; Node parentNode=node.parent; parentNode.rightNode=preNode; } } } /** * 查找某個點的前驅節點 * @param node * @return */ private Node findPreNode(Node node){ Node rightSonNode=node.leftNode; while(rightSonNode.rightNode!=null){ rightSonNode=rightSonNode.rightNode; } return rightSonNode; } /** * 從根節點開始查找節點 * @param node * @param data * @return */ public Node search(Node node,int data){ if(data==node.getData()) return node; if(data>node.getData()){ if(node.rightNode!=null){ return search(node.rightNode, data); }else{ return null; } }else{ if(node.leftNode!=null){ return search(node.leftNode, data); }else{ return null; } } } public static void main(String[] args) { BinarySortTree tree=new BinarySortTree(); tree.addNode(new Node(5)); tree.addNode(new Node(20)); tree.addNode(new Node(10)); tree.addNode(new Node(3)); tree.addNode(new Node(8)); tree.addNode(new Node(15)); tree.addNode(new Node(30)); tree.middle(); tree.delete(20); tree.middle(); } }