public class BinaryTreeDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //先创建一颗二叉树
        BinaryTree binaryTree=new BinaryTree();
        //创建需要的结点
        HeroNode root=new HeroNode(1,"宋江");
        HeroNode node2=new HeroNode(2,"吴用");
        HeroNode node3=new HeroNode(3,"卢俊义");
        HeroNode node4=new HeroNode(4,"林冲");
        HeroNode node5=new HeroNode(5,"关胜");

        //说明,我们先手动创建二叉树,后面我们学习递归的方式创建二叉树
        root.setLeft(node2);
        root.setRight(node3);
        node3.setLeft(node5);
        node3.setRight(node4);
        binaryTree.setRoot(root);

        //测试
        System.out.println("前序遍历");  //1,2,3,5,4
        binaryTree.preOrder();

        System.out.println("中序遍历");  //2,1,5,3,4
        binaryTree.infixOrder();

        System.out.println("后序遍历");  //2,5,4,3,1
        binaryTree.postOrder();;
    }
}

    //定义BinaryTree二叉树
    class BinaryTree{
        private HeroNode root;

        public void setRoot(HeroNode root) {
            this.root=root;
        }

        //前序遍历
        public void preOrder() {
            if(this.root!=null) {
                this.root.preOrder();
            }else {
                System.out.println("二叉树为空,无法遍历");
            }
        }

        //中序遍历
        public void infixOrder() {
            if(this.root!=null) {
                this.root.infixOrder();
            }else {
                System.out.println("二叉树为空,无法遍历");
            }
        }

        //后序遍历
        public void postOrder() {
            if(this.root!=null) {
                this.root.postOrder();
            }else {
                System.out.println("二叉树为空,无法遍历");
            }
        }
    }

    //创建HeroNode结点
    class HeroNode{
        private int no;
        private String name;
        private HeroNode left;//默认null
        private HeroNode right;//默认null
        public HeroNode(int no,String name) {
            this.no=no;
            this.name=name;
        }

        public int getNo() {
            return no;
        }
        public void setNo(int no) {
            this.no = no;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public HeroNode getLeft() {
            return left;
        }
        public void setLeft(HeroNode left) {
            this.left = left;
        }
        public HeroNode getRight() {
            return right;
        }
        public void setRight(HeroNode right) {
            this.right = right;
        }
        //
        @Override
        public String toString() {
            return "HeroNode[no="+no+",name="+name+"]";
        }
        //编写前序遍历的方法
        public void preOrder() {
            System.out.println(this);  //先输出父节点
            //递归向左子树前序遍历
            if(this.left!=null) {
                this.left.preOrder();
            }
            //递归向右子树前序排列
            if(this.right!=null) {
                this.right.preOrder();
            }
        }

        //中序遍历
        public void infixOrder() {
            //递归向左子树中序排列
            if(this.left!=null) {
                this.left.infixOrder();
            }
            //输出父节点
            System.out.println(this);
            //递归向右子树中序遍历
            if(this.right!=null) {
                this.right.infixOrder();
            }
        }

        //后序遍历
        public void postOrder() {
            // TODO Auto-generated method stub
            if(this.left!=null) {
            this.left.postOrder();
        }
        if(this.right!=null) {
            this.right.postOrder();
        }
        System.out.println(this);
        }
    }


---6.7

查找指定节点
分为前序查找,中序查找和后序查找

以前序查找为例
1.先判断当前节点的no是否未查找的
2.如果是相等,则返回当前节点
3.如果不等,则判断当前节点的左子结点是否为空,如果不为空,则递归前序查找
4.如果左递归前序查找,找到则返回,否则继续判断,当前节点的右子结点是否为空,如果不空,则继续向右递归前序查找。

public class BinaryTreeDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //先创建一颗二叉树
        BinaryTree binaryTree=new BinaryTree();
        //创建需要的结点
        HeroNode root=new HeroNode(1,"宋江");
        HeroNode node2=new HeroNode(2,"吴用");
        HeroNode node3=new HeroNode(3,"卢俊义");
        HeroNode node4=new HeroNode(4,"林冲");
        HeroNode node5=new HeroNode(5,"关胜");

        //说明,我们先手动创建二叉树,后面我们学习递归的方式创建二叉树
        root.setLeft(node2);
        root.setRight(node3);
        node3.setLeft(node5);
        node3.setRight(node4);
        binaryTree.setRoot(root);
/*        
        //测试
        System.out.println("前序遍历");  //1,2,3,5,4
        binaryTree.preOrder();

        System.out.println("中序遍历");  //2,1,5,3,4
        binaryTree.infixOrder();

        System.out.println("后序遍历");  //2,5,4,3,1
        binaryTree.postOrder();;
*/        
        System.out.println("前序遍历方式");
        HeroNode resNode=binaryTree.preOrderSearch(5);
        if(resNode!=null) {
            System.out.printf("找到,信息为no=%d name=%s",resNode.getNo(),resNode.getName());
        }else {
            System.out.printf("没有找到 no=%d 的英雄",5);
        }
    }
}

    //定义BinaryTree二叉树
    class BinaryTree{
        private HeroNode root;

        public void setRoot(HeroNode root) {
            this.root=root;
        }

        //前序遍历
        public void preOrder() {
            if(this.root!=null) {
                this.root.preOrder();
            }else {
                System.out.println("二叉树为空,无法遍历");
            }
        }

        //中序遍历
        public void infixOrder() {
            if(this.root!=null) {
                this.root.infixOrder();
            }else {
                System.out.println("二叉树为空,无法遍历");
            }
        }

        //后序遍历
        public void postOrder() {
            if(this.root!=null) {
                this.root.postOrder();
            }else {
                System.out.println("二叉树为空,无法遍历");
            }
        }

        //前序查找
        public HeroNode preOrderSearch(int no) {
            if(root!=null) {
                return root.preOrderSearch(no);
            }else {
                return null;
            }
        }
    }

    //创建HeroNode结点
    class HeroNode{
        private int no;
        private String name;
        private HeroNode left;//默认null
        private HeroNode right;//默认null
        public HeroNode(int no,String name) {
            this.no=no;
            this.name=name;
        }

        public int getNo() {
            return no;
        }
        public void setNo(int no) {
            this.no = no;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public HeroNode getLeft() {
            return left;
        }
        public void setLeft(HeroNode left) {
            this.left = left;
        }
        public HeroNode getRight() {
            return right;
        }
        public void setRight(HeroNode right) {
            this.right = right;
        }
        //
        @Override
        public String toString() {
            return "HeroNode[no="+no+",name="+name+"]";
        }
        //编写前序遍历的方法
        public void preOrder() {
            System.out.println(this);  //先输出父节点
            //递归向左子树前序遍历
            if(this.left!=null) {
                this.left.preOrder();
            }
            //递归向右子树前序排列
            if(this.right!=null) {
                this.right.preOrder();
            }
        }

        //中序遍历
        public void infixOrder() {
            //递归向左子树中序排列
            if(this.left!=null) {
                this.left.infixOrder();
            }
            //输出父节点
            System.out.println(this);
            //递归向右子树中序遍历
            if(this.right!=null) {
                this.right.infixOrder();
            }
        }

        //后序遍历
        public void postOrder() {
            // TODO Auto-generated method stub
            if(this.left!=null) {
            this.left.postOrder();
        }
        if(this.right!=null) {
            this.right.postOrder();
        }
        System.out.println(this);
        }

        //前序遍历查找
        public HeroNode preOrderSearch(int no) {

            System.out.println("进入前序遍历");
            //比较当前节点是不是
            if(this.no==no) {
                return this;
            }

            //1.判断当前结点的左子节点是否为空,如果不为空,则递归前序查找
            //2.如果左递归前序查找,找到结点,则返回
            HeroNode resNode=null;
            if(this.left!=null) {
                resNode=this.left.preOrderSearch(no);
            }
            if(resNode!=null) {//说明左子树找到
                return resNode;
            }
            //1.左递归前序查找,找到结点,则返回,否继续判断
            //2.当前的结点的右子结点是否为空,如果不为空,则继续向右递归前序查找
            if(this.right!=null) {
                resNode=this.right.preOrderSearch(no);
            }
            return  resNode;
        }
    }

删除结点
规则:1、如果删除的结点是叶子节点,则删除该节点
2、如果删除的节点是非叶子节点,则删除该子树

思路:
首先先处理,如果树是空树root,如果只有一个root结点,则等价将二叉树置空
//然后进行下面操作
1、我们的二叉树是单向的,所以我们是判断当前结点的子结点是不是需要删除的结点,而不能去判断当前这个结点是不是需要删除的结点。
2、如果当前结点的左子结点不为空,并且左子结点就是要删除结点,就将this.left=null,并且返回,结束递归删除。
3、如果当前结点的右子结点不为空,并且右子结点就是要删除的结点,就将this.right=null:并且返回,结束递归删除。
4、如果第2和第3步未删除结点,那么我们就需要想左子树进行递归删除。
5.如果第4步未能删除结点,则应当向右子树进行递归删除。