二叉树的基本定义

包括二叉树的前序遍历,中序遍历和后序遍历。

下面的代码是一个基本的二叉树,非二叉排序树和平衡二叉树

声明:下面的代码只是一个最基础的实现,没有经过严格的测试。

 

/**
 * 二叉树
 * 树的遍历参考:https://www.cnblogs.com/zhi-leaf/p/10813048.html
 */
public class BinaryTree {
    public static void main(String[] args) {
        BinaryTree tree =new BinaryTree();
        Node root = tree.createNode(1, "宋江");
        Node node2 = tree.createNode(2, "吴用");
        Node node3 = tree.createNode(3, "卢俊义");
        Node node4 = tree.createNode(4, "林冲");
        Node node5 = tree.createNode(5, "关胜");

        root.left=node2;
        root.right=node3;
        node3.right=node4;
        node3.left=node5;
        tree.rootNode=root;

        tree.preOrderByStack(root);

/*        Node node = tree.preOrderSearch(root, 5);
        System.out.println(node);*/
/*        tree.preOrder(root);
        tree.preOrderDelSimple(tree.rootNode,1);
        System.out.println("----------------");
        tree.preOrder(tree.rootNode);*/


    }
    public Node rootNode;

    public Node createNode(Integer id, String name){
        return new Node(id,name);
    }

    //前序遍历,先父节点再左节点,后右节点
    public void preOrder(Node node){
        if(node==null){
            return;
        }
        //每次都是先输出父节点
        System.out.println(node);
        if(node.left!=null){
            preOrder(node.left);
        }
        if(node.right!=null){
            preOrder(node.right);
        }
    }

    /**
     * 前序遍历,非递归方式(利用了栈的回溯功能)
     * 思路:输出父节点之后,将父节点push到栈中,然后循环获取每个父节点的左子节点。直到左子节点为null。
     * 此时stack最上层的节点就是左子节点为空的节点,pop出该节点,尝试获取右子节点并输出,如果右子节点为空,则继续pop直到
     * 获取到右子节点不为空的节点,输出该节点并获取左子节点并push,直到node为空或者栈为空为止
     * @param node
     */
    public  void preOrderByStack(Node node){
       // MyArrayStack
        MyLinkedStack<Node> stack = new MyLinkedStack<>();

        while (node != null || !stack.isEmpty()){
            if(node != null){
                System.out.println(node);
                stack.push(node);
                node=node.left;
            }else{
                Node temp = stack.pop();
                node=temp.right;
            }
        }
    }

    //中序遍历,先左节点再父节点,后右节点
    public void infixOrder(Node node){
        if(node==null){
            return;
        }

        //每次都是先输出父节点
        if(node.left!=null){
            infixOrder(node.left);
        }
        System.out.println(node);
        if(node.right!=null){
            infixOrder(node.right);
        }
    }


    //后序遍历,先左节点再右节点,后父节点
    public void postOrder(Node node){
        if(node==null){
            return;
        }
        //每次都是先输出父节点
        if(node.left!=null){
            postOrder(node.left);
        }

        if(node.right!=null){
            postOrder(node.right);
        }

        System.out.println(node);
    }

    //前序查找,先父节点再左节点,后右节点。中序和后序查找,类似
    public Node preOrderSearch(Node node,Integer id){
        //如果当前节点是,直接返回
        if(id==node.getId()){
            return node;
        }

        //如果左递归中查找到,则返回
        if(node.left!=null){
            Node nd= preOrderSearch(node.left,id);
            if(nd!=null){
                return nd;
            }
        }
        //如果右递归中查找到,则返回
        if(node.right!=null){
            Node nd= preOrderSearch(node.right,id);
            if(nd!=null){
                return nd;
            }
        }

        return null;
    }

    /**
     * 节点删除的简单实现
     * 如果待删除的节点是头节点,则直接将头节点置空.
     * 如果是叶子节点,则删除该节点
     * 如果是非叶子,则删除该子树
     * @param node
     * @param id
     */
    public   void preOrderDelSimple(Node node, Integer id){
        if(id==this.rootNode.getId()){
            this.rootNode=null;
            return;
        }else{
            preOrderDeleteSimple(node,id);
        }
    }

    /**
     *
     * @param node
     * @param id
     */
    private  void preOrderDeleteSimple(Node node, Integer id) {
        if (node.left != null && node.left.getId() == id) {
            node.left = null;
            return;
        }

        if (node.right != null && node.right.getId() == id) {
            node.right = null;
            return;
        }
        if (node.left != null) {
            preOrderDeleteSimple(node.left, id);
        }
        if (node.right != null) {
            preOrderDeleteSimple(node.right, id);
        }


    }
}
class Node{
    //id
    private Integer id;
    //姓名
    private String name;
    //左节点
    public Node left;
    //右节点
    public Node right;

    public Node(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Node{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值