当前位置 博文首页 > 树基础(Java)_Inmaturity_7的博客:数据结构和算法学习笔记四

    树基础(Java)_Inmaturity_7的博客:数据结构和算法学习笔记四

    作者:[db:作者] 时间:2021-08-01 08:41

    数据结构和算法学习笔记四_树基础

    学习视频:尚硅谷韩老师Java讲解数据结构与算法

    一、树

    树示意图:

    在这里插入图片描述

    树的常用术语(结合示意图理解): 
    1) 节点 
    2) 根节点 
    3) 父节点 
    4) 子节点 
    5) 叶子节点 (没有子节点的节点) 
    6) 节点的权(节点值) 
    7) 路径(从 root 节点找到该节点的路线) 
    8) 层 
    9) 子树 
    10) 树的高度(最大层数) 
    11) 森林 :多颗子树构成森林
    

    二、二叉树

    2.1、二叉树简述

    1. 树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。

    2. 二叉树的子节点分为左节点和右节点

    3. 示意图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1RW9yF8t-1609678072943)(D:\TyporaPic\image-.png)]

    1. 如果该二叉树的所有叶子节点都在最后一层,并且结点总数= 2^n -1 , n 为层数,则我们称为满二叉树。

    在这里插入图片描述

    ? 满二叉树

    1. 如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二

    层的叶子节点在右边连续,我们称为完全二叉树
    在这里插入图片描述

    ? 完全二叉树

    2.2、二叉树前序,中序和后序遍历.

    1. 前序遍历: 先输出父节点,再遍历左子树和右子树

    2. 中序遍历: 先遍历左子树,再输出父节点,再遍历右子树

    3. 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点

    在这里插入图片描述

    代码实现:

    package com.lxf.Tree;
    
    public class BinaryTreeDemo {
        public static void main(String[] args) {
            //创建需要的节点
            HeroNode root=new HeroNode(1,"宋江");
            HeroNode n2=new HeroNode(2,"吴用");
            HeroNode n3=new HeroNode(3,"卢俊义");
            HeroNode n4=new HeroNode(4,"林冲");
            //创建root为节点的树
            root.setLeft(n2);
            root.setRight(n3);
            n3.setRight(n4);
    
            //先需要创建一颗二叉树
            BinaryTree binaryTree=new BinaryTree(root);
            //测试前序:
            binaryTree.preOrder();
            System.out.println();
    
            //测试中序:
            binaryTree.midOrder();
            System.out.println();
    
            //测试后序遍历:
            binaryTree.nexOrder();
            System.out.println();
            
            //结果:
            //HeroNode{no=1, name='宋江'} HeroNode{no=2, name='吴用'} HeroNode{no=3, name='卢俊义'} HeroNode{no=4, name='林冲'} 
            
    		//HeroNode{no=2, name='吴用'} HeroNode{no=1, name='宋江'} HeroNode{no=3, name='卢俊义'} HeroNode{no=4, name='林冲'} 
            
    		//HeroNode{no=2, name='吴用'} HeroNode{no=4, name='林冲'} HeroNode{no=3, name='卢俊义'} HeroNode{no=1, name='宋江'} 
        }
    }
    
    /**
     * 定义BinaryTree二叉树
     */
    class BinaryTree{
        private  HeroNode root;
    
        public BinaryTree() {
        }
    
        public BinaryTree(HeroNode root) {
            this.root = root;
        }
        //前序遍历
        public  void preOrder(){
            if(this.root!=null){
                this.root.preOrder();
            }else{
                System.out.println("二叉树为空,无法遍历");
            }
        }
        //中序遍历
        public  void midOrder(){
            if(this.root!=null){
                this.root.midOrder();
            }else{
                System.out.println("二叉树为空,无法遍历");
            }
        }
        //后序遍历
        public  void nexOrder(){
            if(this.root!=null){
                this.root.nexOrder();
            }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.print(this+" ");//先输出父节点
            //递归向左子树前序遍历
            if(this.left!=null){
                this.left.preOrder();
            }
            //递归向右子树前序遍历
            if(this.right!=null){
                this.right.preOrder();
            }
        }
        /**
         * 中序遍历的方法
         */
        public void midOrder(){
            //递归向左子树中序遍历
            if(this.left!=null){
                this.left.midOrder();
            }
            System.out.print(this+" ");//然后输出父节点
            //递归向右子树中序遍历
            if(this.right!=null){
                this.right.midOrder();
            }
        }
        /**
         * 后序遍历的方法
         */
        public void nexOrder(){
            //递归向左子树后序遍历
            if(this.left!=null){
                this.left.nexOrder();
            }
            //递归向右子树后序遍历
            if(this.right!=null){
                this.right.nexOrder();
            }
            System.out.print(this+" ");//再输出父节点
        }
    
    }
    

    2.3、二叉树前序,中序和后序查找

    1. 请编写前序查找,中序查找和后序查找的方法。

    2. 并分别使用三种查找方式,查找 heroNO = 5 的节点

    3. 并分析各种查找方式,分别比较了多少次

    4. 思路分析图解

    在这里插入图片描述

    代码实现:

    package com.lxf.Tree;
    
    public class BinaryTreeDemo {
        public static void main(String[] args) {
            //创建需要的节点
            HeroNode root=new HeroNode(1,"宋江");
            HeroNode n2=new HeroNode(2,"吴用");
            HeroNode n3=new HeroNode(3,"卢俊义");
            HeroNode n4=new HeroNode(4,"林冲");
            //创建root为节点的树
            root.setLeft(n2);
            root.setRight(n3);
            n3.setRight(n4);
    
            //先需要创建一颗二叉树
            BinaryTree binaryTree=new BinaryTree(root);
            //测试前序查找:
            System.out.println(binaryTree.preOrderSearch(n4));