java——二叉树的实现代码

/**
 * @ClassName Node
 * @Description 树的节点
 * @Author lzq
 * @Date 2018/11/28 12:44
 * @Version 1.0
 **/
public class Node {
    String data;   //元素数据
    Node left;   //左子树节点的引用
    Node right;  //右子树节点的引用
}

import java.util.Scanner;

/**
 * @ClassName BinaryTree
 * @Description 二叉树
 * @Author lzq
 * @Date 2018/11/28 11:52
 * @Version 1.0
 **/
public class BinaryTree {
    Scanner scan = new Scanner(System.in);

    /**
     * 初始化根节点
     * @return
     */
    public Node rootnode() {
        Node node;
        if((node = new Node()) != null) {
            System.out.println("请输入一个根节点数据:");
            node.data = scan.next();
            node.left = null;
            node.right = null;
            if(node != null) {
                return node;
            }else {
                return null;
            }
        }
        return null;
    }


    /**
     * 添加节点
     * @param node
     */
    public void add_tree_node(Node node) {
        Node p,parent;
        String data;
        int count;
        if((p = new Node()) != null) {
            System.out.println("输入二叉树节点数据:");
            p.data = scan.next();
            p.left = null;
            p.right = null;

            System.out.println("请输入该节点的父节点的数据:");
            data = scan.next();
            parent = find_tree_node(node,data);
            if(parent == null) {
                System.out.println("未找到父节点!");
                parent = null;
                return;
            }
            System.out.println("1、添加该结点到左子树\n   2、添加该结点到右子树");
            do {
                count = scan.nextInt();
                if(count == 1 || count == 2) {
                    if(parent == null) {
                        System.out.println("不存在父节点,请先设置父节点!");
                    }else {
                        switch (count) {
                            case 1:
                                if(parent.left != null) {
                                    System.out.println("左子树节点不为空!");
                                }else {
                                    parent.left = p;
                                }
                                break;
                            case 2:
                                if(parent.right != null) {
                                    System.out.println("右子树节点不为空!");
                                }else {
                                    parent.right = p;
                                }
                                break;
                                default:
                                    System.out.println("无效参数!");

                        }
                    }
                }
            }while (count != 1 && count != 2);

        }
    }

    /**
     * 查找节点
     * @param node
     * @param data
     * @return
     */
    public Node find_tree_node(Node node,String data) {
        Node ptr;
        if(node == null) {
            return null;
        }else {
            if(node.data.equals(data)) {
                return node;
            }else {
                if((ptr = find_tree_node(node.left,data)) != null) {
                    return ptr;
                }else if((ptr = find_tree_node(node.right,data)) != null) {
                    return ptr;
                }else {
                    return null;
                }
            }
        }
    }

    /**
     * 获取左子树
     * @param node
     * @return
     */
    public Node left_tree(Node node) {
        if(node != null) {
            return node.left;
        }else {
            return null;
        }
    }


    /**
     * 获取右子树
     * @param node
     * @return
     */
    public Node right_tree(Node node) {
        if(node != null) {
            return node.right;
        }else {
            return null;
        }
    }


    /**
     * 判断二叉树是否为空
     * @param node
     * @return
     */
    public boolean isEmpty(Node node) {
        if(node != null) {
            return false;
        }else {
            return true;
        }
    }

    /**
     * 得到树的深度
     * @param node
     * @return
     */
    public int tree_length(Node node) {
        int depleft,depright;
        if(isEmpty(node)) {
            return 0;
        }else {
            depleft = tree_length(node.left);
            depright = tree_length(node.right);
            if(depleft > depright) {
                return depleft+1;
            }else {
                return depright+1;
            }
        }
    }

    /**
     * 清空二叉树
     * @param node
     */
    public void clear_tree(Node node) {
        if(node != null) {
            clear_tree(node.left);
            clear_tree(node.right);
            node = null;
        }
    }

    /**
     * 得到节点数据
     * @param node
     */
    public String node_data(Node node) {
        System.out.print(node.data+"\t");
        return node.data;
    }

    /**
     * 遍历二叉树,先序遍历
     * @param node
     */
    public void DLR(Node node) {
        if(node != null) {
            node_data(node);
            DLR(node.left);
            DLR(node.right);
        }
    }
}

这儿只写了前序遍历,更多的遍历方式参考;

测试代码:

public class TestDemo6 {
    public static void main(String[] args) {
        Node root = null;
        BinaryTree t = new BinaryTree();
        root = t.rootnode();   //设置根节点
        /**
         * 添加节点
         */
        int i = 1;
        do {
            t.add_tree_node(root);
            i++;
        }while (i <= 5);

       System.out.print("先序遍历:");
        t.DLR(root);
        System.out.println("\n二叉树的深度:"+t.tree_length(root));
        t.clear_tree(root);  //清空
        root = null;
    }
}

java——二叉树的实现代码

请输入一个根节点数据:
A
输入二叉树节点数据:
B
请输入该节点的父节点的数据:
A
1、添加该结点到左子树
2、添加该结点到右子树
1
输入二叉树节点数据:
C
请输入该节点的父节点的数据:
A
1、添加该结点到左子树
2、添加该结点到右子树
2
输入二叉树节点数据:
D
请输入该节点的父节点的数据:
B
1、添加该结点到左子树
2、添加该结点到右子树
1
输入二叉树节点数据:
G
请输入该节点的父节点的数据:
D
1、添加该结点到左子树
2、添加该结点到右子树
1
输入二叉树节点数据:
H
请输入该节点的父节点的数据:
D
1、添加该结点到左子树
2、添加该结点到右子树
2
输入二叉树节点数据:
F
请输入该节点的父节点的数据:
C
1、添加该结点到左子树
2、添加该结点到右子树
2
输入二叉树节点数据:
E
请输入该节点的父节点的数据:
C
1、添加该结点到左子树
2、添加该结点到右子树
1
输入二叉树节点数据:
I
请输入该节点的父节点的数据:
E
1、添加该结点到左子树
2、添加该结点到右子树
2
输入二叉树节点数据:
K
请输入该节点的父节点的数据:
F
1、添加该结点到左子树
2、添加该结点到右子树
1
先序遍历:A	B	D	G	H	C	E	I	F	K	
二叉树的深度:4