
Java版二叉树
先序遍历:根→左→右 中序遍历:左→根→右 后序遍历:左→右→根 层序遍历:按层从左到右遍历
发布日期:2021-05-06 15:16:21
浏览次数:34
分类:精选文章
本文共 4880 字,大约阅读时间需要 16 分钟。
二叉树详解
二叉树是数据结构中的一种重要类型,由节点组成,节点可以有左、右子节点。每个节点包含一个值,左、右指针。二叉树的结构可以用来实现各种数据存储和处理算法。
二叉树定义
二叉树节点包含以下属性:
- 值:节点的数据或信息。
- 左节点:左子树的根节点。
- 右节点:右子树的根节点。
初始化
二叉树的初始化可以通过构造TreeNode对象来实现。例如:
TreeNode root = new TreeNode(1);TreeNode left = new TreeNode(2);TreeNode right = new TreeNode(3);root.leftNode = left;root.rightNode = right;
遍历方法
二叉树的遍历主要有以下几种:
迭代实现
递归实现的优点是代码简洁,缺点是可能导致栈溢出。迭代实现则通过模拟栈来实现递归的效果。
例如,先序遍历的迭代实现:
public void preorder(TreeNode root) { Stackstack = new Stack<>(); stack.push(root); while (!stack.isEmpty()) { TreeNode node = stack.pop(); if (node != null) { // 处理当前节点 stack.push(node.rightNode); stack.push(node.leftNode); } }}
常见题目
先序遍历求和:
- 逆序访问节点,累加值。
- 代码:
private static void preOrder(TreeNode root) { if (Objects.isNull(root)) { return; } int sum = root.getValue() + 1; System.out.println(sum + " "); preOrder(root.getLeftNode()); preOrder(root.getRightNode());}
判断两棵树是否相同:
- 递归比较节点值和左右子树结构。
- 代码:
private boolean isSameTree(TreeNode root1, TreeNode root2) { if (Objects.isNull(root1) && Objects.isNull(root2)) { return true; } if (Objects.isNull(root1) || Objects.isNull(root2)) { return false; } if (root1.getValue() != root2.getValue()) { return false; } return isSameTree(root1.leftNode, root2.leftNode) && isSameTree(root1.rightNode, root2.rightNode);}
层序遍历:
- 使用队列按层遍历。
- 代码:
private static List
levelOrder(TreeNode root) { List result = new ArrayList<>(); if (Objects.isNull(root)) { return result; } Queue queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { TreeNode node = queue.poll(); result.add(node.getValue()); if (node.leftNode != null) { queue.offer(node.leftNode); } if (node.rightNode != null) { queue.offer(node.rightNode); } } } return result;}
节点数计算:
- 使用层序遍历统计节点数。
- 代码:
private static int countNodes(TreeNode root) { if (Objects.isNull(root)) { return 0; } return 1 + countNodes(root.leftNode) + countNodes(root.rightNode);}
交换左右节点:
- 递归交换每个节点的左右子树。
- 代码:
public TreeNode invertTree(TreeNode root) { if (Objects.isNull(root)) { return null; } TreeNode temp = root.rightNode; root.rightNode = root.leftNode; root.leftNode = temp; invertTree(root.leftNode); invertTree(root.rightNode); return root;}
完全二叉树节点数:
- 判断是否为完全二叉树,计算满二叉树节点数。
- 代码:
private static int getPrefectBinaryCount(TreeNode root) { int height = 0; while (Objects.nonNull(root)) { root = root.getLeftNode(); height++; } return (int) Math.pow(2, height) - 1;}
序列化:
- 使用前序遍历生成字符串。
- 代码:
public static String serialize(TreeNode root) { StringBuilder sb = new StringBuilder(); serialize(root, sb); return sb.toString();}private static void serialize(TreeNode root, StringBuilder sb) { if (Objects.isNull(root)) { sb.append("#,"); return; } sb.append(root.getValue() + ","); serialize(root.leftNode, sb); serialize(root.rightNode, sb);}
反序列化:
- 使用队列反序读取节点值。
- 代码:
public static TreeNode deserialize(String data) { LinkedList
nodes = new LinkedList<>(); for (String s : data.split(",")) { nodes.addLast(s); } return deserialize(nodes);}public static TreeNode deserialize(LinkedList nodes) { if (nodes.isEmpty()) { return null; } String first = nodes.removeFirst(); if (first.equals("#")) { return null; } int value = Integer.parseInt(first); TreeNode root = new TreeNode(value); root.leftNode = deserialize(nodes); root.rightNode = deserialize(nodes); return root;}
最近公共祖先:
- 使用层序遍历找出p和q的最近公共祖先。
- 代码:
public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (Objects.isNull(root)) { return null; } if (root == p || root == q) { return root; } TreeNode left = lowestCommonAncestor(root.leftNode, p, q); TreeNode right = lowestCommonAncestor(root.rightNode, p, q); if (Objects.nonNull(left) && Objects.nonNull(right)) { return root; } if (Objects.isNull(left) && Objects.isNull(right)) { return null; } return Objects.nonNull(left) ? left : right;}
二叉搜索树遍历:
- 递归或迭代地查找目标值。
- 代码:
public static void binarySearchTree(TreeNode root, int target) { if (Objects.isNull(root)) { return; } if (root.value == target) { return; } if (root.value < target) { binarySearchTree(root.rightNode, target); } else { binarySearchTree(root.leftNode, target); }}
通过以上方法,可以系统地掌握二叉树的实现和常见算法,满足各种开发需求。