二叉树的基本操作(Java实现)

在Java中可以通过下面这种方式定义一个二叉树的类:

public class TreeNode {
  int data;
  TreeNode left;
  TreeNode right;

  public TreeNode(int data) {
    this.data = data;
  }

下面介绍一些操作二叉树的基本方法:

1.构建二叉树

/**
   * 构建二叉树
   * @param inputList 输入序列
   * @return node 返回根节点
   */
  public static TreeNode creatBinaryTree(LinkedList<Integer> inputList){
    TreeNode node = null;
    if(inputList == null || inputList.isEmpty()){
      return null;
    }
    Integer data = inputList.removeFirst(); //去除并返回LinkedList中的第一个元素
    if (data != null){
      node = new TreeNode(data);
      node.left = creatBinaryTree(inputList);
      node.right = creatBinaryTree(inputList);
    }
    return node;
  }

main函数:

 public static void main(String[] args) {
    LinkedList<Integer> inputList = new LinkedList<Integer>(
            Arrays.asList(new Integer[]{3,2,9,null,null,10,null,null,8,null,4})
    );
    TreeNode treeNode = creatBinaryTree(inputList);
    }

2.深度优先遍历

深度优先遍历分为前序遍历,中序遍历,后序遍历。主要采用递归的思路

/**
   * 前序遍历
   * @param node 二叉树根节点
   */
  public static void preOrderTraveral(TreeNode node){
    if (node == null){
      return;
    }
    System.out.println(node.data);
    preOrderTraveral(node.left);
    preOrderTraveral(node.right);
  }

  /**
   * 中序遍历
   * @param node 二叉树根节点
   */
  public static void inOrderTraveral(TreeNode node){
    if (node == null){return;}
    inOrderTraveral(node.left);
    System.out.println(node.data);
    inOrderTraveral(node.right);
  }

  /**
   * 后序遍历
   * @param node 二叉树根节点
   */
  public static void postOrderTraveral(TreeNode node){
    if(node == null){
      return;
    }
    postOrderTraveral(node.left);
    postOrderTraveral(node.right);
    System.out.println(node.data);
  }

3.层序遍历

/**
 * @author 结构化思维wz
 * 二叉树的层序遍历
 */

public class LevelOrder {
    public static Queue levelOrderTraversal(TreeNode root){
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while(! queue.isEmpty()){
            TreeNode node = queue.poll();
            System.out.println(node.data);
            if(node.left != null){
                queue.offer(node.left);
            }
            if (node.right != null){
                queue.offer(node.right);
            }
        }
        return queue;
    }

}

4.如何判断两个二叉树相同

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:
在这里插入图片描述

输入:p = [1,2,3], q = [1,2,3]
输出:true

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p == null && q == null){return true;} //都为空必然相同
        if(p == null || q == null){return false;} //一个空一个非空肯定是false;
        if(p.val != q.val){
            return false;
        }
        return isSameTree(p.left, q.left) && isSameTree(p.right , q.right);

    }
}

5.如何判断一个二叉树是否对称

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3
class Solution {
    public boolean isSymmetric(TreeNode root) {
      return  check(root.left,root.right);
    }
    public boolean check(TreeNode p, TreeNode q){
        if(p ==null && q ==null){return true;}
        if(p == null || q == null){return false;}
        return p.val == q.val && check(p.left , q.right) &&check(p.right ,q.left);
    }
}

6.判断二叉树的高度

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7]3
   / \
  9  20
    /  \
   15   7
返回它的最大深度 3
class Solution {
    public int maxDepth(TreeNode root) {
        return root == null ? 0 : Math.max(maxDepth(root.left),maxDepth(root.right))+1;

    }
}
  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
二叉树的基本算法包括二叉树的创建、遍历和查找等操作。下面是Java语言实现二叉树基本算法的示例代码: ```java // 定义二叉树节点类 class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; this.left = null; this.right = null; } } // 二叉树类 class BinaryTree { private TreeNode root; public BinaryTree() { this.root = null; } // 创建二叉树 public void createBinaryTree(int[] arr) { if (arr == null || arr.length == 0) { return; } this.root = createBinaryTree(arr, 0, arr.length - 1); } private TreeNode createBinaryTree(int[] arr, int start, int end) { if (start > end) { return null; } int mid = (start + end) / 2; TreeNode root = new TreeNode(arr[mid]); root.left = createBinaryTree(arr, start, mid - 1); root.right = createBinaryTree(arr, mid + 1, end); return root; } // 前序遍历 public void preOrder() { preOrder(this.root); } private void preOrder(TreeNode root) { if (root == null) { return; } System.out.print(root.val + " "); preOrder(root.left); preOrder(root.right); } // 中序遍历 public void inOrder() { inOrder(this.root); } private void inOrder(TreeNode root) { if (root == null) { return; } inOrder(root.left); System.out.print(root.val + " "); inOrder(root.right); } // 后序遍历 public void postOrder() { postOrder(this.root); } private void postOrder(TreeNode root) { if (root == null) { return; } postOrder(root.left); postOrder(root.right); System.out.print(root.val + " "); } // 查找节点 public TreeNode search(int val) { return search(this.root, val); } private TreeNode search(TreeNode root, int val) { if (root == null || root.val == val) { return root; } TreeNode left = search(root.left, val); if (left != null) { return left; } return search(root.right, val); } } // 测试代码 public class Main { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5, 6, 7}; BinaryTree binaryTree = new BinaryTree(); binaryTree.createBinaryTree(arr); System.out.print("前序遍历:"); binaryTree.preOrder(); System.out.println(); System.out.print("中序遍历:"); binaryTree.inOrder(); System.out.println(); System.out.print("后序遍历:"); binaryTree.postOrder(); System.out.println(); System.out.println("查找节点 4:" + binaryTree.search(4).val); } } ``` 输出结果为: ``` 前序遍历:4 2 1 3 6 5 7 中序遍历:1 2 3 4 5 6 7 后序遍历:1 3 2 5 7 6 4 查找节点 4:4 ``` 以上代码实现二叉树的创建、前序遍历、中序遍历、后序遍历和查找节点等基本算法。其中,创建二叉树使用了二分法,遍历使用了递归方式实现,查找节点使用了递归方式和回溯思想实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

结构化思维wz

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

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

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

打赏作者

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

抵扣说明:

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

余额充值