二叉树

来源:互联网 发布:接单软件 编辑:程序博客网 时间:2024/06/06 17:09

二叉树

  1. 二叉树是一个连通的无环图,并且每一个顶点的度不大于3
  2. 在非空二叉树中,第i层的结点总数不超过 , i>=1;
  3. 深度为h的二叉树最多有 个结点(h>=1),最少有h个结点;
  4. 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;

二叉树基本操作

  1. 节点的定义
/** * Created by ln on 2017/5/6. */public class Node {    //左孩子    public Node left;    //右孩子    public Node right;    //key    public int value;    //color    public int color;    public void displayNode(){        //...    }}
  1. 属性:根节点
public Node root;
  1. 插入操作
    //插入节点    public void insert(int v,int c){        Node newNode = new Node();        newNode.value = v;        newNode.color = c;        if(root == null){            root = newNode;        }else{            Node current = root;            Node parent;            while (true){                parent = current;                if(v<parent.value){                    current = parent.left;                    if(current==null){                        parent.left = newNode;                        return;                    }                }else{                    current = parent.right;                    if(current==null){                        parent.right=newNode;                        return;                    }                }            }        }    }
  1. 查找操作
    //查找节点    public Node find(int key){        Node current = root;        while (current.value!=key){            if(key<current.value){                current = current.left;            }else{                current = current.right;            }            if(current==null){                return null;            }        }        return current;    }
  1. 查找最小
    //查找最小节点    public Node findMin(){        Node current = root;        while (true){            if(current.left==null){                break;            }else {                current = current.left;            }        }        return current;    }
  1. 查找最大
    //查找最大节点    public Node findMax(){        Node current = root;        while (true){            if(current.right==null){                break;            }else {                current = current.right;            }        }        return current;    }
  1. 删除操作
   //删除节点    public boolean delete(int key){        boolean isLeft = true;        Node current = root;        Node parent = current;        while (current.value!=key){            parent = current;            if(key<current.value){                isLeft = true;                current = current.left;            }else{                isLeft = false;                current = current.right;            }            if(current==null){                return false;            }        }        //1.        if(current.left==null&&current.right==null){            if(current==root){                current=null;            }else if(isLeft){                parent.left=null;            }else {                parent.right=null;            }        //2.        }else if(current.right==null){            if(current==root){                root = current.left;            }else if(isLeft){                parent.left=current.left;            }else {                parent.right=current.left;            }        //        }else if(current.left==null) {            if (current == root) {                root = current.right;            } else if (isLeft) {                parent.left = current.right;            } else {                parent.right = current.right;            }        //3.        }else {            Node node = getLast(current);            if(current==root){                root = node;            }else if(isLeft){                parent.left=node;            }else {                parent.right=node;            }            node.left = current.left;        }        return true;    }    //寻找后继节点    public Node getLast(Node dNode){        Node rNode = dNode.right;        Node parent = dNode;        while (rNode.left!=null){            parent = rNode;            rNode = rNode.left;        }        if(rNode!=dNode.right){            parent.left=rNode.right;            rNode.right=dNode.right;        }        return rNode;    }
  1. 遍历操作
    //中序遍历    public void inOrder(Node node){        if(node!=null){            inOrder(node.left);            System.out.print(node.value+" ");            inOrder(node.right);        }    }
0 0
原创粉丝点击