3.1 树与树的表示




练习:leetcode [704] 二分查找 (Easy)
//给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否
//则返回 -1。
//
//
//示例 1:
//
// 输入: nums = [-1,0,3,5,9,12], target = 9
//输出: 4
//解释: 9 出现在 nums 中并且下标为 4
//
//
// 示例 2:
//
// 输入: nums = [-1,0,3,5,9,12], target = 2
//输出: -1
//解释: 2 不存在 nums 中因此返回 -1
//
//
//
//
// 提示:
//
//
// 你可以假设 nums 中的所有元素是不重复的。
// n 将在 [1, 10000]之间。
// nums 的每个元素都将在 [-9999, 9999]之间。
//
// Related Topics 二分查找
// 👍 161 👎 0
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
int mid = 0;
while (left <= right){
mid = (left + right) / 2;
if (nums[mid] > target)
right = mid - 1;
else if (nums[mid] < target)
left = mid + 1;
else
return mid;
}
return -1;
}
}
//leetcode submit region end(Prohibit modification and deletion)
3.2 二叉树及存储结构



3.3 二叉树的遍历


用递归的方式,很容易写出来
-
先序

-
中序

-
后序

练习:leetcode [94] 二叉树的中序遍历 (Easy)
//给定一个二叉树,返回它的中序 遍历。
//
// 示例:
//
// 输入: [1,null,2,3]
// 1
// \
// 2
// /
// 3
//
//输出: [1,3,2]
//
// 进阶: 递归算法很简单,你可以通过迭代算法完成吗?
// Related Topics 栈 树 哈希表
// 👍 751 👎 0
//leetcode submit region begin(Prohibit modification and deletion)
import java.util.ArrayList;
import java.util.List;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>(); // 定义存储result的线性表res
inorder(root, res); // 调用递归函数
return res; // 返回结果
}
public void inorder(TreeNode root, List<Integer> res) { // 中序遍历的递推函数
if (root == null) return; // 若为空节点,返回
inorder(root.left, res); // 左子树 遍历
res.add(root.val); // 中
inorder(root.right, res); // 左子树 遍历
}
}
//leetcode submit region end(Prohibit modification and deletion)
-
小结
-
因为要返回一个存储结果的线性表
res,所以跟PPT有点不一样,递归函数inorder要传入这个res -
leetcode写的是遇到null就return,PPT是判断非null才继续。两种方法都可以。 -
看懂输入的意义?是对应满二叉树
// 输入: [1,null,2,3] // 1 // \ // 2 // / // 3 -
若改为先序?后序?
- 很简单,调整一下递归函数里面的顺序即可。
-

练习:leetcode [94] 二叉树的中序遍历 (Medium)
// 二叉树的中序遍历
class Solution {
// 栈方法
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>(); // 定义存储result的线性表res
Stack<TreeNode> st = new Stack<TreeNode>(); // 新建一个TreeNode类型的栈
while (root != null || !st.isEmpty()) {
while (root != null) { // 遇到一个结点,就把它push进栈,然后遍历它的左子树,直到为空(因为中序是左子树、中结点、右子树)
st.push(root);
root = root.left;
}
root = st.pop(); // 弹出栈顶的结点
res.add(root.val); // 把该节点的值存到res
root = root.right; // 然后遍历该点的右子树(因为中序是左子树、中结点、右子树)
}
return res; // 返回结果
}


3.* 小白专场:树的同构
略