栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java---二叉树

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java---二叉树

Java---二叉树
  • 概念
    • 基本概念
    • 满二叉树
    • 完全二叉树
  • 树的表示形式
    • 孩子兄弟表示法
    • 孩子表示法
  • 树的性质
  • 二叉树的基本操作实现

概念 基本概念

和链表与顺序表不同,二叉树不是线性的.之所以称之为二叉树,是因为它看起来像倒着的树.

  1. 节点的度:含有子树的个数
  2. 树的度:所有节点中最大的度
  3. 叶子结点/终端节点:度为0的节点
  4. 双亲节点/父节点:含有子节点的节点
  5. 孩子节点/子节点:含有子树的根节点的节点
  6. 根节点:没有双亲节点的节点
  7. 节点的层次:一般来说,根为第一层,根的孩子节点为第二层,以此类推
  8. 非终端节点/分支节点:度不为0的节点
  9. 兄弟节点:含有相同的父亲节点的节点
  10. 堂兄弟节点:父亲节点在同一层的节点
  11. 节点的祖先:从根到该节点的所有节点
  12. 森林:多个不相交的树的集合
满二叉树

每层的节点个数都达到最大值

完全二叉树

每个节点都和满二叉树从0到n的编号的节点一一对应的二叉树
也就是说,最后一层从最右面省略若干个节点的二叉树就是完全二叉树

树的表示形式 孩子兄弟表示法
class Node {
	int value; // 数据
	Node firstChild; // 第一个孩子引用
	Node nextBrother; // 下一个兄弟引用
}
孩子表示法
class Node {
	int value; // 数据
	Node left; // 左子树
	Node right; // 右子树
}
树的性质
  1. 若根节点为第一层,则第i层最多有2^(i-1)个节点
  2. 若根节点的深度为1,则深度为k的二叉树最多有2^k - 1个节点
  3. 若叶节点的个数是n0,度为2的个数为n2,则 n0 = n2 + 1
  4. n个节点的二叉树的深度为log2 (n + 1)取整
  5. 若根节点的编号是0,则一个节点的双亲结点的编号是(i - 1)/2,左孩子是2i + 1,右孩子为2i + 2
二叉树的基本操作实现

BinaryTree.java

package BinaryTree;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class BinaryTree {
    static class TreeNode {
        public char val;
        public TreeNode left;
        public TreeNode right;

        public TreeNode(char val){
            this.val = val;
        }


        @Override
        public String toString() {
            return "TreeNode{" +
                    "val=" + val +
                    '}';
        }
    }

    public TreeNode root;

    public void createTree() {
        TreeNode A = new TreeNode('A');
        TreeNode B = new TreeNode('B');
        TreeNode C = new TreeNode('C');
        TreeNode D = new TreeNode('D');
        TreeNode E = new TreeNode('E');
        TreeNode F = new TreeNode('F');
        TreeNode G = new TreeNode('G');
        TreeNode H = new TreeNode('H');

        A.left = B;
        A.right = C;
        B.left = D;
        B.right = E;
        C.left = F;
        C.right = G;
        E.right = H;
        this.root = A;
    }

    public void preOrder(TreeNode root){
        if(root == null){
            return;
        }
        System.out.print(root.val + " ");
        preOrder(root.left);
        preOrder(root.right);
    }

    public void inOrder(TreeNode root){
        if(root == null) {
            return;
        }
        inOrder(root.left);
        System.out.print(root.val + " ");
        inOrder(root.right);
    }

    public void postOrder(TreeNode root){
        if(root == null){
            return;
        }
        postOrder(root.left);
        postOrder(root.right);
        System.out.print(root.val + " ");
    }

    // 获取树中节点的个数
    int size(TreeNode root){
        if(root == null){
            return 0;
        }
        return size(root.left) + size(root.right) + 1;
    }

    // 获取叶子节点的个数
    int getLeafNodeCount(TreeNode root){
        if(root == null){
            return 0;
        }
        if(root.right == null && root.left == null){
            return 1;
        }
        return getLeafNodeCount(root.left) + getLeafNodeCount(root.right);
    }

    // 获取第K层节点的个数
    int getKLevelNodeCount(TreeNode root,int k){
        if(root == null){
            return 0;
        }
        if(k == 1){
            return 1;
        }
        return getKLevelNodeCount(root.left,k - 1) + getKLevelNodeCount(root.right,k - 1);
    }

    // 获取二叉树的高度
    int getHeight(TreeNode root){
        if(root == null){
            return 0;
        }
        int left = getHeight(root.left);
        int right = getHeight(root.right);
        return left > right ? left + 1 : right + 1;
    }

    // 检测值为value的元素是否存在
    TreeNode find(TreeNode root, char val){
        if(root == null){
            return null;
        }
        if(root.val == val){
            return root;
        }
        TreeNode left = find(root.left,val);
        if(left != null){
            return left;
        }
        TreeNode right = find(root.right,val);
        if(right != null){
            return right;
        }
        return null;
    }

    //层序遍历
    void levelOrder(TreeNode root){
        Queue q = new LinkedList<>();
        q.add(root);
        TreeNode cur = root;
        while(!q.isEmpty()){
            cur = q.poll();
            if(cur.left != null){
                q.add(cur.left);
            }
            if(cur.right != null){
                q.add(cur.right);
            }
            System.out.println(cur);
        }
    }

    // 判断一棵树是不是完全二叉树
    boolean isCompleteTree(TreeNode root){
        Queue q = new LinkedList<>();
        q.add(root);
        TreeNode cur = root;
        while(!q.isEmpty()){
            cur = q.poll();
            if(cur == null){
                break;
            }
            q.add(cur.left);
            q.add(cur.right);
        }
        while(!q.isEmpty()){
            if(q.peek() != null){
                return false;
            }
            q.poll();
        }
        return true;
    }

}

TestDemo.java

package BinaryTree;

import BinaryTree.BinaryTree;

public class TestDemo {
    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        binaryTree.createTree();
        binaryTree.preOrder(binaryTree.root);
        System.out.println();
        System.out.println(binaryTree.size(binaryTree.root));
        System.out.println(binaryTree.getLeafNodeCount(binaryTree.root));
        System.out.println(binaryTree.getKLevelNodeCount(binaryTree.root, 4));
        System.out.println(binaryTree.getHeight(binaryTree.root));
        BinaryTree.TreeNode node = binaryTree.find(binaryTree.root,'a');
        if(node != null){
            System.out.println(node.toString());
        } else {
            System.out.println("null");
        }
        binaryTree.levelOrder(binaryTree.root);
        System.out.println(binaryTree.isCompleteTree(binaryTree.root));
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1013933.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号