树的简单介绍

image.png

结点的度
结点拥有的子树数称为结点的度。度为0的结点称为叶子结点或终端结点(如上图的GHIJ),度不为0的结点称为非终端结点或分支结点(如ABC等)。除根结点以外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。(如此时B结点的度是1,D结点的度是3)

层次与深度
结点的层次从根开始定义起,根为第一层,根的孩子是第二层。若某节点在第k层,则其子树的根就在k+1层。其双亲在同一层的结点互为堂兄弟。树中的结点的最大层次称为树的深度或高度。

image.png

有序与无序树
如果将树中结点的各子树看成从左到右是有次序的,不能互换的,则称改树有序树,否则称为无序树

树的存储结构
三种表示方法

  • 双亲表示法
  • 孩子表示法
  • 孩子兄弟表示法
    image.png

image.png

image.png

image.png

二叉树

image.png

特殊二叉树
所有的结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树。这两者统称为斜树

满二叉树
在一颗二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树

完全二叉树
完全二叉树实际和满二叉树差不多,满二叉树一定是完全二叉树,但是完全二叉树最后一层是可以缺少的,但是缺少的只能是右边的

二叉树的性质

image.png

image.png

image.png

image.png
image.png

image.png

image.png

简单使用

public class BinaryTree {
    //根结点
    public TreeNode root = null;

    public BinaryTree() {
        root = new TreeNode(1, "A");
    }
    /**
     * 构建二叉树
     *         A
     *     B       C
     * D      E        F
     */
    public void createBinaryTree() {
        TreeNode nodeB = new TreeNode(2, "B");
        TreeNode nodeC = new TreeNode(3, "C");
        TreeNode nodeD = new TreeNode(4, "D");
        TreeNode nodeE = new TreeNode(5, "E");
        TreeNode nodeF = new TreeNode(6, "F");
        root.leftNodes=nodeB;
        root.rightNodes=nodeC;
        nodeB.leftNodes = nodeD;
        nodeB.rightNodes = nodeE;
        nodeC.rightNodes = nodeF;
    }
    /**
     * 前序遍历——迭代 根结点->左结点->右结点
     *         A
     *     B       C
     * D      E        F
     */
    public void preOrder(TreeNode node) {//前序遍历:A B D E C F
        if(node==null){
            return;
        }else{
            System.out.println(node.data);
            preOrder(node.leftNodes);
            preOrder(node.rightNodes);
        }
    }
    /**
     * 中序遍历——迭代  左结点->根结点->右结点
     *         A
     *     B       C
     * D      E        F
     */
    public void midOrder(TreeNode node) {//D B E A C F
        if(node==null){
            return;
        }else{
            midOrder(node.leftNodes);
            System.out.println(node.data);
            midOrder(node.rightNodes);
        }
    }
    /**
     * 后序遍历——迭代 左结点->右结点->根结点
     *         A
     *     B       C
     * D      E        F
     */
    public void postOrder(TreeNode node) {//D E B F C A
        if(node==null){
            return;
        }else{
            postOrder(node.leftNodes);
            postOrder(node.rightNodes);
            System.out.println(node.data);
        }
    }
    /**
     * 获得二叉树的高度或深度
     */
    public int getHeight() {
        return getHeight(root);
    }

    /**
     * 获得二叉树的高度或深度
     */
    private int getHeight(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int i = getHeight(root.leftNodes);
        int j = getHeight(root.rightNodes);
        return (i < j) ? j + 1 : i + 1;
    }

    /**
     * 获取二叉树的结点数
     */
    public int getSize() {
        return getSize(root);
    }

    private int getSize(TreeNode root) {
        if(root==null){
            return 0;
        }else {
            return 1+getSize(root.leftNodes)+getSize(root.rightNodes);
        }
    }

    /**
     * 判断是否是平衡树:可以是空树,左右子树的高度差不会超过1,并且左右子树都是平衡二叉树
     */
    public boolean isBalanceTree(TreeNode root) {
          if(root==null){
              return true;
          }
          //左右子树的高度差不会超过1
        int leftDepth=getHeight(root.leftNodes);
        int rightDepth=getHeight(root.rightNodes);
        
        //左右子树都是平衡二叉树

        return Math.abs(leftDepth-rightDepth)<=1&&isBalanceTree(root.leftNodes)&&isBalanceTree(root.rightNodes);
    }

    public class TreeNode {
        private int index;
        private String data;
        private TreeNode leftNodes;
        private TreeNode rightNodes;
        public TreeNode(int index, String data) {
            this.index = index;
            this.data = data;
        }

        public String getData() {
            return data;
        }

        public void setData(String data) {
            this.data = data;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值