06树

74 阅读2分钟

06树

介绍:树是由n(n>=1) 个悠闲节点组成一个具有层次关系的集合。
相关操作:
1. 树的创建
//创建一棵树:
public class TreeNode{
    private int data;
    private TreeNode left;
    private TreeNode right;
    public TreeNode(){}
    public TreeNode(int data){this.data = data;}
    public TreeNode(int data,TreeNode left,TreeNode right){
        this.data = data;
        this.left = left;
        this.right = right;
    }
}
2. 常用方法
//TreeNode head = new TreeNode(1);

//2.1向树中添加元素:
add(0,head);
add(2,head);
public void add(int data,TreeNode root){
    if(root == null || root.data == data){
        reutrn;
    }
    if(root.data > data){
        if(root.left == null){
            TreeNode new1 = new TreeNode(data);
            root.left = new1;
        }else{
            add(data,root.left);
        }
    }else{
        if(root.right == null){
            TreeNode new1 = new TreeNode(data);
            root.right = new1;
        }else{
            add(data,root.right);
        }
    }
}
输出结果(前序遍历):head = [1,0,2];

//2.2树的前序遍历:
TreeNode cur = head;
public void front(){
    System.out.print(cur.data);
    if(cur.left != null){this.front(cur.left);}
    if(cur.right != null){this.front(cur.right);}
}
输出结果:cur = [1,0,2];

//2.3树的中序遍历:
TreeNode cur = head;
public void mid(){
    if(cur.left != null){this.front(cur.left);}
    System.out.print(cur.data);
    if(cur.right != null){this.front(cur.right);}
}
输出结果:cur = [0,1,2];

//2.4树的后序遍历:
TreeNode cur = head;
public void bank(){
    if(cur.left != null){this.front(cur.left);}
    if(cur.right != null){this.front(cur.right);}
    System.out.print(cur.data);
}
输出结果:cur = [1,2,0];

//2.5删除指定节点2:
delete(null,head,2,true);
public void delete(TreeNode prev,TreeNode root,int data,boolean isRight){
    if(root.data == data){
        if(root.left == null && root.right == null){
            changeValue(prev,null,isRight);
        }else if(root.left != null && root.right != null){
            changeValue(prev,new TreeNode(findMin(root,root.right,true),isRight));
            if(prev == null){
                prev = this.root;
                prev.left = root.left;
                prev.right = root.right;
                return;
            }
            if(isRight){
                prev.right.right = root.right;
                prev.right.left = root.left;
            }else{
                prev.left.right = root.right;
                prev.left.left = root.left;
            }
        }else if(root.left != null){
            changeValue(prev,root.left,isRight);
        }else{
            changeValue(prev,root.right,isRight);
        }
        return;
    }
    if(root.data > data){
        delete(root,root.left,data,false);
    }else{
        delete(root,root.right,data,true);
    }
}
//改变元素值
public void changeValue(TreeNode,TreeNode value,boolean isRight){
    if(prev == null){
        root = value;
        return;
    }
    if(isRight){
        prev.right = value;
    }else{
        prev.left = value;
    }
}
//寻找大于根节点的最小值
public int findMin(TreeNode prev,TreeNode root,boolean isRight){
    if(root.left == null && root.right == null){
        changeValue(prev,null,isRight);
        return root.data;
    }
    if(root.left == null){
        changeValue(prev,null,isRight);
        return rppt.data;
    }
    return findMin(root,root.left,false);
}
输出结果:head = [0,1];

//2.6查找指定元素是否存在:
boolean flag = isExit(1,head);
public boolean isExit(int data,TreeNode root){
    if(root == null){
        return false;
    }
    if(root.data == data){
        return true;
    }else if(root.data > data){
        return isExit(root.left,data);
    }else{
        reutrn isExit(root.right,data);
    }
}
输出结果:flag = true;

//2.7获取叶子节点个数:
int count = getLeafCount(head);
public int getLeafCount(TreeNode root){
    if(root == null){
        return 0;
    }
    if(root.left == null && root.right == null){
        return 1;
    }
    return getLeafCount(root.left) + getLeafCount(root.right);
}
输出结果:count = 3;

//2.8获取树的高度:
int height = getHeight(head);
public int getHeight(TreeNode root){
    if(root == null) return 0;
    int leftHeight = getHeight(root.left);
    int rightHeight = getHeight(root.right);
    return rightHeight > leftHeight ? rightHeight + 1 : leftHeight + 1;
}
输出结果:height = 2;