平衡二叉树

满二叉树:

1,叶子节点在最后一层

2,除过叶子节点 其余非叶子节点都有左右孩子

二分搜索树/二分排序树:

1,当前节点的值大于左节点的值,小于右节点的值

2,每一棵子树也是二分搜索树

注:存储元素的值必须具有可比性

树的遍历:

1,层序遍历

2,中序遍历:按左,根,右方式遍历(二分搜索树的特点:从小到大依次输出)

3,后序遍历:按左,右,根方式遍历

4,先序遍历:按根,左,右方式遍历

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class BSTress<T extends Comparable<T>> {
    class TreeNode<T> {
        T val;//节点的值

        TreeNode<T> left;//左节点->当前节点左孩子
        TreeNode<T> right;//右节点->当前节点右孩子

        public TreeNode(T val, TreeNode<T> left, TreeNode<T> right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }

        public TreeNode(T val) {
            this.val = val;
            this.left = this.right = null;
        }

    }//树的节点信息

    private TreeNode<T> root;
    private int size;

    //创建二叉搜索树
    public BSTress() {
        this.root = null;
        this.size = 0;
    }
    //前中后序遍历

    //输入节点 生成二叉搜索树
    public void searchTree(T val) {
        this.root = searchTree(root, val);
    }

    private TreeNode<T> searchTree(TreeNode<T> root, T val) {
        //递归终止条件
        if (root == null) {
            this.size++;
            root = new TreeNode<>(val);
            return root;
        }
        //递归操作
        if (root.val.compareTo(val) > 0) {
            root.left = searchTree(root.left, val);
        } else if (root.val.compareTo(val) < 0) {
            root.right = searchTree(root.right, val);
        }
        return root;
    }

    //打印List结果
    public void showList(ArrayList<T> list) {
        if (list == null) {
            return;
        } else {
            list.stream().forEach(item -> {
                System.out.println(item.toString());
            });
        }
    }

    //前序遍历(根 左 右)
    public ArrayList<T> preTravel() {
        ArrayList<T> result = new ArrayList<>();
        preTravel(this.root, result);
        return result;
    }

    private TreeNode<T> preTravel(TreeNode<T> root, ArrayList<T> result) {
        //递归终止条件
        if (root == null) {
            return root;
        }
        //递归操作
        result.add(root.val);
        preTravel(root.left, result);
        preTravel(root.right, result);
        return root;
    }

    //后序遍历(左 右 根)
    public ArrayList<T> sufTravel() {
        ArrayList<T> result = new ArrayList<>();
        sufTravel(this.root, result);
        return result;
    }

    private TreeNode<T> sufTravel(TreeNode<T> root, ArrayList<T> result) {
        //递归终止条件
        if (root == null) {
            return root;
        }
        //递归操作
        sufTravel(root.left, result);
        sufTravel(root.right, result);
        result.add(root.val);
        return root;
    }

    //中序遍历(左 根 右 )
    public ArrayList<T> midTravel() {
        ArrayList<T> result = new ArrayList<>();
        midTravel(this.root, result);
        return result;
    }

    private TreeNode<T> midTravel(TreeNode<T> root, ArrayList<T> result) {
        //递归终止条件
        if (root == null) {
            return root;
        }
        //递归操作
        midTravel(root.left, result);
        result.add(root.val);
        midTravel(root.right, result);
        return root;
    }

    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BSTress<Integer> bsTress = new BSTress<>();
        for (int i = 0; i < 10; i++) {
            int val = cin.nextInt();
            bsTress.searchTree(val);
        }
        System.out.println("----前序遍历----");
        bsTress.showList(bsTress.preTravel());
        System.out.println("----中序遍历----");
        bsTress.showList(bsTress.midTravel());
        System.out.println("----后序遍历----");
        bsTress.showList(bsTress.sufTravel());
        System.out.println();
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Adellle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值