您的位置:首页 > 其它

文章标题

2016-09-14 10:09 323 查看
package datastructures.binarytree;
/**
* 演示二叉树的操作
*/
public class BinaryTree {
/**
* 根节点
*/
private Node root;
/**
* 查找一个节点
* @param key 要查找的id值
* @return
*/
public Node find(int key){
//当前节点
Node current = root;
while(current.getId()!=key){
if(current.getId() > key){
current = current.getLeftChild();
}else if(current.getId() < key){
current = current.getRightChild();
}
if(current == null){
return null;
}
}
return current;
}
/**
* 插入一个节点
* @param id
* @param data
*/
public void insert(int id,int data){
//1:先创建一个新节点
Node newNode = new Node(id,data);

if(root == null){
root = newNode;
}else{
//2:查找要插入的位置
Node current = root;
Node parent = null;

while(true){
parent = current;
if(id < current.getId()){
current = current.getLeftChild();
//如果没有左子节点
if(current == null){
//3:修改相应的节点的属性
parent.setLeftChild(newNode);
return;
}
}else{
current = current.getRightChild();
if(current==null){
//3:修改相应的节点的属性
parent.setRightChild(newNode);
return;
}
}
}
}
}
/**
* 前序获取节点数据
* @param node
*/
public void preOrder(Node node){
if(node != null){
System.out.println(node.getId()+" - ");
preOrder(node.getLeftChild());
preOrder(node.getRightChild());
}
}
/**
* 中序获取节点数据
* @param node
*/
public void inOrder(Node node){
if(node != null){
inOrder(node.getLeftChild());
System.out.println(node.getId()+" - ");
inOrder(node.getRightChild());
}
}
/**
* 后序获取节点数据
* @param node
*/
public void postOrder(Node node){
if(node != null){
postOrder(node.getLeftChild());
postOrder(node.getRightChild());
System.out.println(node.getId()+" - ");
}
}
/**
* 获取最小节点
* @return
*/
public Node getMinNode(){
Node current = root;
Node lastNode = null;
while(current!=null){
lastNode = current;
current = current.getLeftChild();
}
return lastNode;
}
/**
* 获取最大节点
* @return
*/
public Node getMaxNode(){
Node current = root;
Node lastNode = null;
while(current!=null){
lastNode = current;
current = current.getRightChild();
}
return lastNode;
}
/**
* 删除一个节点
* @param key
* @return
*/
public boolean delete(int key){
//1:找到要删除的节点
Node current = root;
Node parent = root;
boolean isLeftChild = true;

while(current.getId()!=key){
parent = current;
if(current.getId() > key){
isLeftChild = true;
current = current.getLeftChild();
}else if(current.getId() < key){
isLeftChild = false;
current = current.getRightChild();
}
if(current == null){
return false;
}
}

//2:没有子节点
if(current.getLeftChild()==null && current.getRightChild()==null){
this.noChildren(parent, current, isLeftChild);
}
//3:只有一个子节点
//只有左节点
else if(current.getRightChild()== null){
this.oneLeftChild(parent, current, isLeftChild);
}
//只有右节点
else if(current.getLeftChild() == null){
this.oneRightChild(parent, current, isLeftChild);
}
//4:有两个子节点
else{
//4.1:找到中序后继节点
Node successor = this.getSuccessor(current);
if(current == root){
root = successor;
}else{
if(isLeftChild){
parent.setLeftChild(successor);
}else{
parent.setRightChild(successor);
}
}
//重新设置successor的leftChild
successor.setLeftChild(current.getLeftChild());
}
return true;
}
/**
* 找到要删除节点的中序后继节点
* @param delNode
* @return
*/
private Node getSuccessor(Node delNode){
Node successor = delNode;
Node successorParent = delNode;
Node current = delNode.getRightChild();
//查找节点
while(current!=null){
successorParent = successor;
successor = current;
current = current.getLeftChild();
}
//设置相应的值
if(successor!=delNode.getRightChild()){
successorParent.setLeftChild(successor.getRightChild());
successor.setRightChild(delNode.getRightChild());
}
return successor;
}
private void oneRightChild(Node parent,Node current,boolean isLeftChild){
if(current == root){
root = current.getRightChild();
}else{
if(isLeftChild){
parent.setLeftChild(current.getRightChild());
}else{
parent.setRightChild(current.getRightChild());
}
}
}
private void oneLeftChild(Node parent,Node current,boolean isLeftChild){
if(current == root){
root = current.getLeftChild();
}else{
if(isLeftChild){
parent.setLeftChild(current.getLeftChild());
}else{
parent.setRightChild(current.getLeftChild());
}
}
}

private void noChildren(Node parent,Node current,boolean isLeftChild){
if(current == root){
root = null;
}else{
if(isLeftChild){
parent.setLeftChild(null);
}else{
parent.setRightChild(null);
}
}
}

public static void main(String[] args) {
BinaryTree t = new BinaryTree();

t.insert(6,6);
t.insert(5,2);
t.insert(8,2433);
t.insert(3, 5);
t.insert(7,77);
t.insert(9,233);

//      System.out.println(t.root.toString());
//
//      t.inOrder(t.find(6));
//
//      Node min = t.getMinNode();
//      Node max = t.getMaxNode();
//      System.out.println("min=="+min);
//      System.out.println("max=="+max);

t.delete(8);

System.out.println(t.root.toString());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树