(笔记)第三讲 树(上)

183 阅读2分钟

数据结构 第三讲 树(上) - 浙江大学

3.1 树与树的表示

image-20201020210237156

image-20201020210331006

image-20201020210040518

image-20201020210111853

练习: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 二叉树及存储结构

image-20201020214831630

image-20201020214427611

image-20201020214816521

3.3 二叉树的遍历

image-20201021210119140

image-20201020214509236

递归的方式,很容易写出来

  • 先序image-20201020222244856

  • 中序image-20201020222256725

  • 后序

    image-20201020222307947

练习: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写的是遇到nullreturn,PPT是判断非null才继续。两种方法都可以。

    • 看懂输入的意义?是对应满二叉树

      // 输入: [1,null,2,3]
      //   1
      //    \
      //     2
      //    /
      //   3
      
    • 若改为先序?后序?

      • 很简单,调整一下递归函数里面的顺序即可。

image-20201021200516927

练习: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; // 返回结果
    }

image-20201021210204941

image-20201021210223694

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