java 二叉树的实现

二叉树在Java中有两种方法可以实现,用数组实现和用链表实现,本篇主要讲这两个方法:

一、数组实现二叉树,缺点是浪费空间,代码如下:

package offer.tree;

/**
 * Created by Taoyongpan on 2017/10/15.
 * 二叉树的创建和一般操作
 * 数组实现二叉树,浪费很多的内存空间
 * 左孩子下标 = 父节点下标*2
 * 右孩子下标 = 父节点下标*2+1
 */
public class TreeDemo {

//    int root = 1;
    int btree[];
    private int root = 1;
    private int leftchild;
    private int rightchild;
    public TreeDemo(int data){
        btree = new int[16];
        btree[1] = data;
    }
    //新增
    public void add(int data){
        int root =1;
        while (btree[root]!=0){
            if (btree[root]>=data){
                root = root*2;
            }else {
                root = root*2+1;
            }
        }
        btree[root] = data;
    }
    //遍历
    public void display(){
        for (int i = 1 ; i<btree.length;i++){
            System.out.println("btree["+i+"]="+btree[i]);
        }
    }
    //删除
    public void del(int data){
        int root = 1;
        while (btree[root]!=data){
            if (btree[root]>data){
                root = root*2;
            }else if (btree[root]<data){
                root = root*2+1;
            }
        }
        btree[root] = 0;
    }
    //查找
    public int query(int data){
        int root = 1;
        while (btree[root]!=data){
            if (btree[root]>data){
                root = root*2;
            }else if (btree[root]<data){
                root = root*2+1;
            }
        }
        return root;
    }
    public static void main(String[] args){
        TreeDemo tree = new TreeDemo(10);
        tree.add(8);
        tree.add(7);
        tree.add(11);
        tree.add(3);
        tree.add(20);
        tree.display();
        tree.del(3);
        tree.display();
    }
}

 二、用链表实现,代码如下:

package offer.tree;

/**
 * Created by Taoyongpan on 2017/10/15.
 * 链表实现二叉树
 */
public class TreeNode {

    int data;
    TreeNode leftchild;
    TreeNode rightchild;
    //初始化
    public TreeNode(){
        data = 0;
        leftchild = null;
        rightchild =null;
    }
    //新增节点
    public TreeNode(int data){
        this.data = data;
        leftchild = null;
        rightchild =null;
    }
}
package offer.tree;

import java.util.*;

/**
 * Created by Taoyongpan on 2017/10/15.
 * 前序遍历 :根节点,左节点,右节点
 * 中序遍历:左节点,根节点,右节点
 * 后序遍历:左节点,右节点,根节点
 */
public class TreeLink {

    TreeNode root = null;
    //创建根节点
    public TreeLink(int data){
        root = new TreeNode(data);
    }
    //创建节点
    public void add(int data){
        TreeNode d = new TreeNode(data);
        TreeNode p = root;
        while (p!=null){
            if (p.data>=d.data){
                //往左走
                if (p.leftchild!=null){
                    p = p.leftchild;
                }else {
                    p.leftchild=d;
                    break;
                }
            }else {
                //往右走
                if (p.rightchild!=null){
                    p = p.rightchild;
                }else {
                    p.rightchild = d;
                    break;
                }
            }
        }
    }
    //前序遍历
    public void display(TreeNode root){
        TreeNode p = root;
        System.out.println("p.data="+p.data);
        if (p.leftchild!=null){
            display(p.leftchild);
        }
        if (p.rightchild!=null){
            display(p.rightchild);
        }
    }
   
    //递归版前序遍历
    public static List<Integer> preorderRecursively(TreeNode root){
        List<Integer> tree = new ArrayList<>();
        if (root==null){
            return tree;
        }
        tree.add(root.data);
        tree.addAll(preorderRecursively(root.leftchild));
        tree.addAll(preorderRecursively(root.rightchild));
        return tree;
    }
    //递归版中序遍历
    public static List<Integer> inorderRecursively(TreeNode root){
        List<Integer> tree = new ArrayList<>();
        if (root==null){
            return tree;
        }
        tree.addAll(inorderRecursively(root.leftchild));
        tree.add(root.data);
        tree.addAll(inorderRecursively(root.rightchild));
        return tree;
    }
    //递归版后序遍历
    public static List<Integer> postorderRecursively(TreeNode root){
        List<Integer> tree = new ArrayList<>();
        if (root==null){
            return tree;
        }
        tree.addAll(postorderRecursively(root.leftchild));
        tree.addAll(postorderRecursively(root.rightchild));
        tree.add(root.data);
        return tree;
    }

    //非递归版本前序遍历
    public static List<Integer> preorderIteratively(TreeNode root){
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> list = new ArrayList<>();
        TreeNode p = root;
        if (root == null){
            return list;
        }
        while (p!=null||!stack.isEmpty()){
            if (p!=null){
                list.add(p.data);
                stack.push(p);
                p = p.leftchild;
            }else {
                p = stack.pop().rightchild;
            }
        }
        return list;
    }
    //非递归版本中序遍历
    public static List<Integer> inorderIteratively(TreeNode root){
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> list = new ArrayList<>();
        TreeNode p = root;
        while (p!=null||!stack.isEmpty()){
            if (p!=null){
                stack.push(p);
                p = p.leftchild;
            }else {
                list.add(stack.peek().data);
                p = stack.pop().rightchild;
            }
        }
        return list;
    }
    //非递归版后序遍历
    public static List<Integer> postorderIteratively(TreeNode root){
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> list = new ArrayList<>();
        TreeNode p = root;
        TreeNode d = null;
        while (p!=null||!stack.isEmpty()){
            if (p!=null){
                stack.push(p);
                p = p.leftchild;
            }else {
                p = stack.peek().rightchild;
                if (p!=null&&d!=p){
                    stack.push(p);
                    p = p.leftchild;
                }else {
                    d = stack.pop();
                    list.add(d.data);
                    p = null;
                }
            }
        }
        return list;
    }
    //层序遍历
    public static List<Integer> levelorder(TreeNode root){
        Queue<TreeNode> queue = new LinkedList<>();
        TreeNode p = null;
        List<Integer> list = new LinkedList<>();
        if (root==null){
            return null;
        }
        queue.offer(root);
        while (!queue.isEmpty()){
            p = queue.poll();
            list.add(p.data);
            if (p.leftchild!=null){
                queue.offer(p.leftchild);
            }
            if (p.rightchild!=null){
                queue.offer(p.rightchild);
            }
        }
        return list;
    }
    //主函数
    public static void main(String[] args){
        TreeLink tree = new TreeLink(10);
        tree.add(8);
        tree.add(11);
        tree.add(20);
        tree.add(7);
        tree.add(3);
        //递归版前序遍历
        tree.display(tree.root);
        //递归版前序遍历
        System.out.println("递归版本前序遍历:");
        List<Integer> list = preorderRecursively(tree.root);
        for (int i = 0 ; i<list.size();i++){
            System.out.println(list.get(i));
        }
        //递归版中序遍历
        System.out.println("递归版本中序遍历:");
        List<Integer> list1 = inorderRecursively(tree.root);
        for (int i = 0 ; i<list1.size();i++){
            System.out.println(list1.get(i));
        }
        //递归版后序遍历
        System.out.println("递归版本后序遍历:");
        List<Integer> list2 = postorderRecursively(tree.root);
        for (int i = 0 ; i<list2.size();i++){
            System.out.println(list2.get(i));
        }
        //非递归版本前序遍历
        System.out.println("非递归版本前序遍历:");
        List<Integer> list3 = preorderIteratively(tree.root);
        for (int i = 0 ; i<list3.size();i++){
            System.out.println(list3.get(i));
        }
        //非递归版本中序遍历
        System.out.println("非递归版本中序遍历:");
        List<Integer> list4 = inorderIteratively(tree.root);
        for (int i = 0 ; i<list4.size();i++){
            System.out.println(list4.get(i));
        }
        //非递归版本后序遍历
        System.out.println("非递归版本后序遍历:");
        List<Integer> list5 = postorderIteratively(tree.root);
        for (int i = 0 ; i<list5.size();i++){
            System.out.println(list5.get(i));
        }
        //层序遍历
        System.out.println("非递归版本后序遍历:");
        List<Integer> list6 = levelorder(tree.root);
        for (int i = 0 ; i<list6.size();i++){
            System.out.println(list6.get(i));
        }
    }
}

猜你喜欢

转载自taoyongpan.iteye.com/blog/2396514