java数据结构:二叉树

树:树形结构的特点是一个节点可有多个直接后继,是一种常用的非线性结构。

二叉树:结合了有序数组和链表的优点,在树中查找数据和在有序数组中查找一样快,增删数据和在链表中一样快。

 

插入操作时,二叉树从根节点开始,比父节点大的往左边插入,比父节点小的往右边插入

 

下面是链表实现二叉树:

Node.java

 

package BTree;

/**
 * 链表二叉树的节点类
 */
public class Node {
    int data;
    Node leftChild;
    Node rightChild;
    //初始化根节点
    public Node(){
        data = 0;
        leftChild = null;
        rightChild = null;
    }
    //初始化节点
    public Node(int data){
        this.data = data;
        leftChild = null;
        rightChild = null;
    }
}

 

LinkOfBTree.java

 

package BTree;

/**
 * @author
 * 链表实现二叉树
 * 三种遍历方式:先根遍历,中根遍历,后根遍历
 */
public class LinkOfBTree {
    Node root = null;
    //初始化二叉树
    public LinkOfBTree(int data){
        root = new Node(data);
    }

    //新增节点
    public void add(int data){
        Node node = new Node(data);
        Node temp = root;
        while(true){
            if(temp.data >= data){
                if(temp.leftChild != null)
                    temp = temp.leftChild;
                else {
                    temp.leftChild = node;
                    break;
                }
            }else{
                if(temp.rightChild != null)
                    temp = temp.rightChild;
                else{
                    temp.rightChild = node;
                    break;
                }
            }
        }
    }

    /**打印二叉树:递归
     *node:初始数据为根节点*
     *先根遍历
    */
    public void displayRootFirst(Node node){
        System.out.println("节点值:"+node.data);
        if(node.leftChild != null)
            displayRootFirst(node.leftChild);
        if(node.rightChild != null)
            displayRootFirst(node.rightChild);
    }

    /**
     * 中根遍历二叉树
     */
    public void displayRootMid(Node node){
        if(node.leftChild != null)
            displayRootMid(node.leftChild);
        System.out.println("节点值:"+node.data);
        if(node.rightChild != null)
            displayRootMid(node.rightChild);
    }

    /**
     * 后根遍历二叉树
     */
    public void displayRootLast(Node node){
        if(node.leftChild != null)
            displayRootLast(node.leftChild);
        if(node.rightChild != null)
            displayRootLast(node.rightChild);
        System.out.println("节点值:"+node.data);
    }

    public static void main(String[] a){
        LinkOfBTree tree = new LinkOfBTree(10);
        tree.add(8);
        tree.add(7);
        tree.add(3);
        tree.add(11);
        tree.add(3);
        tree.add(20);
        tree.add(26);
        tree.add(11);
        System.out.println("------先根遍历------");
        tree.displayRootFirst(tree.root);
        System.out.println("------中根遍历------");
        tree.displayRootMid(tree.root);
        System.out.println("------后根遍历------");
        tree.displayRootLast(tree.root);
    }
}

 

 

 

 

 

posted @ 2017-11-26 22:00  古巷青砖  阅读(269)  评论(0编辑  收藏  举报