二叉树操作(Java语言)

基本概念

除了根节点之外,每个节点只要一个父节点,根节点没有父节点。除了叶节点之外,所有节点都有一个或者多个节点,叶节点没有子节点。父节点和子节点之间用指针相连。

二叉树

所谓二叉树是树的一种特殊结构,在二叉树中每个节点最多只能拥有两个子节点。

这里写图片描述

二叉树具有以下性质:

  1. 非空二叉树的第n层上至多有2^(n-1)个元素。
  2. 深度为h的二叉树至多有2^h-1个结点。

数据结构定义

public class BTNode {
    int val; //值
    BTNode left;    //左子树
    BTNode right;   //右子树
    public BTNode(){

    }
    public BTNode(int val){
        this.val = val;
    }
    public BTNode(int val, BTNode left, BTNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }

}


二叉树操作

遍历

遍历即将树的所有结点访问且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。

  • 前序遍历:先访问根结点,再访问左子结点,最后访问右子结点
  • 中序遍历:先访问左子结点,再访问根结点,最后访问右子结点
  • 后序遍历:先访问左子结点,再访问右子结点,最后访问根结点

如下图所示二叉树

这里写图片描述

前序遍历:10 6 4 2 8 14 12 16
中序遍历:2 4 6 8 10 12 14 16
后序遍历:2 4 8 6 12 16 14 10

代码实现

前序遍历

/**
     * 前序遍历
     * 先访问根结点,再访问左子结点,最后访问右子结点
     * @param root
     */
    public void preorder(BTNode root){
        //先访问根结点
        System.out.print(root.val+" ");
        if(root.left!=null){
            preorder(root.left);
        }
        if(root.right!=null){
            preorder(root.right);
        }
    }

中序遍历

/**
     * 中序遍历
     * 先访问左子结点,再访问根结点,最后访问右子结点
     * @param root
     */
    public void middleorder(BTNode root){
        //先访问左子结点
        if(root.left!=null){
            middleorder(root.left);
        }
        System.out.print(root.val+" ");
        if(root.right!=null){
            middleorder(root.right);
        }
    }

后序遍历

/**
     * 后序遍历
     * 先访问左子结点,再访问右子结点,最后访问根结点
     * @param root
     */
    public void lastorder(BTNode root){

        if(root.left!=null){
            lastorder(root.left);
        }
        if(root.right!=null){
            lastorder(root.right);
        }
        System.out.print(root.val+" ");
    }

层次遍历

/**
     * 层次遍历
     * @param root
     */
    public void layerorder(BTNode root){
        if(root==null){
            return;
        }
        //队列,先进先出
        Queue<BTNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){

            BTNode node = queue.poll();

            System.out.print(node.val+" ");

            if(node.left!=null){
                queue.add(node.left);
            }
            if(node.right!=null){
                queue.add(node.right);
            }
        }
    }

获取二叉树的高度

/**
     * 获取二叉树的高度
     * @param root
     * @return
     */
    public int getHeight(BTNode root){
        if(root==null){
            return 0;
        }
        int left = getHeight(root.left);  
        int right = getHeight(root.right);

        int h = (left>right?left:right)+1;

        return h;  
    }

获取二叉树结点的数量

/**
     * 获取二叉树结点的数量
     * @param root
     * @return
     */
    public int getCount(BTNode root){
        if(root==null){
            return 0;
        }
        return getCount(root.left)+getCount(root.right)+1;
    }

判断两棵 二叉树 是否相等

/**
     * 判断两棵 二叉树 是否相等
     * @param root1
     * @param root2
     * @return
     */
    public boolean equals(BTNode root1, BTNode root2){
        if((root1==null && root2==null) ||root1.val == root2.val){
            return true;
        }

        if(equals(root1.left, root2.left) && equals(root1.right, root2.right)){
            return true;
        }

        return false;
    }

测试代码

        //构造上图中的二叉树
        BTNode node8 = new BTNode(2);

        BTNode node4 = new BTNode(4, node8, null);
        BTNode node5 = new BTNode(8);

        BTNode node2 = new BTNode(6, node4, node5);

        BTNode node6 = new BTNode(12);
        BTNode node7 = new BTNode(16);

        BTNode node3 = new BTNode(14, node6, node7);

        BTNode root = new BTNode(10, node2, node3);

        System.out.println("前序遍历:");
        preorder(root);

        System.out.println("--------------");

        System.out.println("中序遍历:");
        middleorder(root);

        System.out.println("--------------");

        System.out.println("后序遍历:");
        lastorder(root);

        System.out.println("--------------");

        System.out.println("层次遍历:");
        layerorder(root);

        System.out.println("--------------");
        System.out.println("结点数量:"+getCount(root));

        System.out.println("--------------");
        System.out.println("高度:"+getHeight(root));
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 Java 语言实现的二叉树排序示例代码。在这个示例中,我们创建了一个 TreeNode 类来表示二叉树的节点,其中包括节点的值、左子节点和右子节点。我们还创建了一个 BinarySearchTree 类来表示二叉搜索树,其中包括插入节点、查找节点和中序遍历等操作。 ```java public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class BinarySearchTree { private TreeNode root; public void insert(int val) { root = insert(root, val); } private TreeNode insert(TreeNode node, int val) { if (node == null) { node = new TreeNode(val); } else if (val < node.val) { node.left = insert(node.left, val); } else if (val > node.val) { node.right = insert(node.right, val); } return node; } public boolean find(int val) { return find(root, val); } private boolean find(TreeNode node, int val) { if (node == null) { return false; } else if (val == node.val) { return true; } else if (val < node.val) { return find(node.left, val); } else { return find(node.right, val); } } public void inorderTraversal() { inorderTraversal(root); } private void inorderTraversal(TreeNode node) { if (node != null) { inorderTraversal(node.left); System.out.print(node.val + " "); inorderTraversal(node.right); } } } // 测试 public class Main { public static void main(String[] args) { BinarySearchTree tree = new BinarySearchTree(); tree.insert(4); tree.insert(2); tree.insert(7); tree.insert(1); tree.insert(3); tree.insert(6); tree.insert(9); System.out.println("中序遍历结果:"); tree.inorderTraversal(); System.out.println("\n是否包含 5:"); System.out.println(tree.find(5)); } } ``` 在上面的示例中,我们创建了一个 BinarySearchTree 对象,向其中插入了一些节点,并进行了中序遍历,输出了结果。我们还使用 find 方法查找了树中是否包含值为 5 的节点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值