当前位置: 首页 > news >正文

树与二叉树完全解析:从基础到应用

目录

一、树形结构的基础认知

1.1 树的定义与特点

1.2 核心术语解析

二、二叉树的深度解析

2.1 二叉树定义

2.2 特殊二叉树类型

2.3 重要性质总结

三、二叉树的存储与遍历

3.1 存储方式对比

3.2 遍历算法精讲

四、经典题型训练

4.1 相同树判断(LeetCode 100)

4.2 子树判断(LeetCode 572)

4.3 平衡二叉树判断(LeetCode 110)

4.4 翻转二叉树(LeetCode 226)

4.5 对称二叉树(LeetCode 101) 


一、树形结构的基础认知

1.1 树的定义与特点

树是一种非线性数据结构,由有限节点组成层次关系集合。核心特点:

  • ​唯一根节点​​:没有父节点的起始点
  • ​分层结构​​:每个节点都是子树的根
  • ​隔离原则​​:子树互不相交(否则形成图结构)
1.2 核心术语解析
术语说明示例图示意
​结点的度​结点的子节点数量A的度为3
​叶子结点​度为0的末端节点H、I、J等
​树的度​树中所有结点度的最大值示例树的度为3
​层次​根为第1层,向下逐层递增根→子→孙

二、二叉树的深度解析

2.1 二叉树定义

每个结点最多有两个子节点的树结构,严格区分左子树和右子树。

2.2 特殊二叉树类型
  1. ​满二叉树​

    • 每层结点数达到最大值
    • 深度为k时,总结点数=2^k -1
    • 示例:深度3的满二叉树有7个结点
  2. ​完全二叉树​

    • 除最后一层外全满
    • 最后一层结点左对齐
    • 应用场景:堆结构实现
2.3 重要性质总结
  1. ​叶子结点公式​​:n0 = n2 + 1
    (叶子结点数=度为2的结点数+1)

  2. ​结点与深度关系​​:

    • 最大结点数:2^k -1
    • 完全二叉树深度:⌈log₂(n+1)⌉
  3. ​顺序存储特性​​(数组表示):

    • 父结点索引:(i-1)/2
    • 左子结点:2i+1
    • 右子结点:2i+2

三、二叉树的存储与遍历

3.1 存储方式对比
存储方式优点缺点
顺序存储访问速度快适合完全二叉树
链式存储灵活处理任意结构需要额外指针空间

链式存储代码实现​​:

class TreeNode {int val;TreeNode left;TreeNode right;public TreeNode(int val) {this.val = val;}
}
3.2 遍历算法精讲

​递归遍历三件套​​:

// 前序遍历
void preOrder(TreeNode root) {if (root == null) return;System.out.print(root.val + " ");preOrder(root.left);preOrder(root.right);
}// 中序遍历 
void inOrder(TreeNode root) {if (root == null) return;inOrder(root.left);System.out.print(root.val + " ");inOrder(root.right);
}// 后序遍历
void postOrder(TreeNode root) {if (root == null) return;postOrder(root.left);postOrder(root.right);System.out.print(root.val + " ");
}

​非递归遍历技巧​​:

// 前序遍历(栈实现)
void preOrderStack(TreeNode root) {Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while (cur != null || !stack.isEmpty()) {while (cur != null) {System.out.print(cur.val + " ");stack.push(cur);cur = cur.left;}cur = stack.pop().right;}
}

层序遍历(队列实现)​​:

void levelOrder(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();if (root != null) queue.offer(root);while (!queue.isEmpty()) {TreeNode node = queue.poll();System.out.print(node.val + " ");if (node.left != null) queue.offer(node.left);if (node.right != null) queue.offer(node.right);}
}

四、经典题型训练

4.1 相同树判断(LeetCode 100)

​问题描述​​:判断两棵树结构和值是否完全相同。

​递归解法​​:

public boolean isSameTree(TreeNode p, TreeNode q) {// 结构判断if (p == null && q == null) return true;if (p == null || q == null) return false;// 值判断 + 递归验证子树return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
4.2 子树判断(LeetCode 572)

​解题思路​​:双重递归验证

public boolean isSubtree(TreeNode root, TreeNode subRoot) {if (root == null) return false;return isSame(root, subRoot) || isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
}private boolean isSame(TreeNode a, TreeNode b) {if (a == null && b == null) return true;if (a == null || b == null) return false;return a.val == b.val && isSame(a.left, b.left) && isSame(a.right, b.right);
}
4.3 平衡二叉树判断(LeetCode 110)

​优化解法​​(时间复杂度O(n)):

public boolean isBalanced(TreeNode root) {return height(root) != -1;
}private int height(TreeNode root) {if (root == null) return 0;int left = height(root.left);if (left == -1) return -1;int right = height(root.right);if (right == -1 || Math.abs(left - right) > 1) return -1;return Math.max(left, right) + 1;
}
4.4 翻转二叉树(LeetCode 226)
public TreeNode invertTree(TreeNode root) {if (root == null) return null;TreeNode temp = root.left;root.left = invertTree(root.right);root.right = invertTree(temp);return root;
}
4.5 对称二叉树(LeetCode 101) 
public boolean isSymmetric(TreeNode root) {return root == null || checkSymmetry(root.left, root.right);
}private boolean checkSymmetry(TreeNode left, TreeNode right) {if (left == null && right == null) return true;if (left == null || right == null) return false;return left.val == right.val && checkSymmetry(left.left, right.right) && checkSymmetry(left.right, right.left);
}

 

相关文章:

  • 4.27-5.4学习周报
  • 如何实现服务的自动扩缩容(Auto Scaling)
  • 1️⃣7️⃣three.js_OrbitControls相机控制器
  • 溯因推理思维——AI与思维模型【92】
  • 【免费】2007-2021年上市公司对外投资数据
  • 数字世界的“私人车道“:网络切片如何用Python搭建专属通信高速路?
  • P2196 [NOIP 1996 提高组] 挖地雷
  • Python爬虫基础总结
  • 【算法】动态规划专题一 斐波那契数列模型 1-4
  • SQL基础全面指南:从CRUD操作到高级特性实战
  • GC9D01 和 GC9A01两种TFT 液晶显示驱动芯片
  • IntelliJ IDEA
  • Socat 用法详解:网络安全中的瑞士军刀
  • 依赖倒置原则
  • Kotlin 基础
  • 软件性能测试报告:办公软件性能如何满足日常工作需求?
  • 文章一《人工智能学习框架入门指南》
  • Paddle Serving|部署一个自己的OCR识别服务器
  • 【算法滑动窗口】最大的连续1的个数III
  • 一种快速计算OTA PSRR的方法(Ⅱ)
  • 民族音乐还能这样玩!这场音乐会由AI作曲
  • 视频公开课上线之后,北大成为多少人未曾谋面的母校?
  • 戴上XR头盔,五一假期在上海也能体验“登陆月球”
  • 申活观察|咖香涌动北外滩,带来哪些消费新想象?
  • 俄伏尔加格勒机场正式更名为斯大林格勒机场
  • 俄罗斯延长非法滞留外国人限期离境时间至9月