• 根据前序遍历结果构造二叉搜索树


    根据前序遍历结果构造二叉搜索树-力扣 1008 题

    题目说明:

    1.preorder 长度>=1

    2.preorder 没有重复值

    直接插入

    解题思路:

    数组索引[0]的位置为根节点,与根节点开始比较,比根节点小的就往左边插,比根节点大的就往右边插,插入的前提是要插入的位置是Null

    注意:根据前序遍历的结果,可以唯一地构造出一个二叉搜索树

    对于前序遍历不是太理解的,作者推荐适合小白的文章:

    二叉树的初步认识_加瓦不加班的博客-CSDN博客

    // 8 5 1 7 10 
    /*
                    8
                   / \
                  5   10
                 / \   \
                1   7  12
             */

    1. // 8 5 1 7 10
    2. /*
    3. 8
    4. / \
    5. 5 10
    6. / \ \
    7. 1 7 12
    8. */
    9. public TreeNode bstFromPreorder(int[] preorder) {
    10. //数组索引[0]的位置为根节点
    11. TreeNode root = insert(null, preorder[0]);
    12. for (int i = 1; i < preorder.length; i++) {
    13. insert(root, preorder[i]);
    14. }
    15. return root;
    16. }
    17. private TreeNode insert(TreeNode node, int val) {
    18. //找到空位了就创建一个新节点将val插入进去
    19. if (node == null) {
    20. return new TreeNode(val);
    21. }
    22. if(val < node.val) {
    23. //继续查询空位 如果查询到空位,要和父节点建立关系
    24. node.left = insert(node.left, val);
    25. } else if(node.val < val){
    26. node.right = insert(node.right, val);
    27. }
    28. return node;
    29. }

    上限法

    解题思路:

    //依次处理prevorder中每个值,返回创建好的节点或者null
    //1.如果超过上限,返回null 作为孩子返回
    //2.如果没超过上限,创建节点,并设置其左右孩子
    //  左右孩子完整后返回

    1. //依次处理prevorder中每个值,返回创建好的节点或者null
    2. //1.如果超过上限,返回null 作为孩子返回
    3. //2.如果没超过上限,创建节点,并设置其左右孩子
    4. // 左右孩子完整后返回
    5. public TreeNode bstFromPreorder(int[] preorder) {
    6. return insert(preorder, Integer.MAX_VALUE);
    7. }
    8. int i = 0;
    9. private TreeNode insert(int[] preorder, int max) {
    10. //递归结束条件
    11. if (i == preorder.length) {
    12. return null;
    13. }
    14. int val = preorder[i];
    15. System.out.println(val + String.format("[%d]", max));
    16. if (val > max) {
    17. //如果超过上限,返回null 作为孩子返回
    18. return null;
    19. }
    20. //如果没超过上限,创建节点,并设置其左右孩子
    21. TreeNode node = new TreeNode(val);
    22. i++;
    23. node.left = insert(preorder, node.val);
    24. node.right = insert(preorder, max);
    25. return node;
    26. }

    依次处理 prevorder 中每个值, 返回创建好的节点或 null 作为上个节点的孩子

    1. 如果超过上限, 返回 null

    2. 如果没超过上限, 创建节点, 并将其左右孩子设置完整后返回

      • i++ 需要放在设置左右孩子之前,意思是从剩下的元素中挑选左右孩子

    分治法

    解题思路:

    //分治法 8,5,1,7,10,12
    //8根  左:5,1,7   右:10,12
    //5根  左:1     右:7
    //10根 左:null  右:12

    //我们如何去分治呢?首先我们找到的是 题目给出的是前序遍历出来的,那么我们只要找到比根节点大的数开始就可以区分左、右子树的范围

    1. //分治法 8,5,1,7,10,12
    2. //8根 左:5,1,7 右:10,12
    3. //5根 左:1 右:7
    4. //10根 左:null 右:12
    5. //我们如何去分治呢?首先我们找到的是 题目给出的是前序遍历出来的,那么我们只要找到比根节点大的数开始就可以区分左、右子树的范围
    6. public TreeNode bstFromPreorder(int[] preorder) {
    7. return partition(preorder, 0, preorder.length - 1);
    8. }
    9. //int start, int end 告诉处理范围
    10. private TreeNode partition(int[] preorder, int start, int end) {
    11. //结束条件
    12. if (start > end) {
    13. return null;
    14. }
    15. //获取根节点 创建根节点对象
    16. TreeNode root = new TreeNode(preorder[start]);
    17. //跳过根节点开始找左、右子树的范围
    18. int index = start + 1;
    19. //条件是一直找到区域的结束
    20. while (index <= end) {
    21. //区分左、右子树的范围
    22. if (preorder[index] > preorder[start]) {
    23. break;
    24. }
    25. index++;
    26. }
    27. //此时 index 就是左、右子树的分界线
    28. root.left = partition(preorder, start + 1, index - 1);
    29. root.right = partition(preorder, index, end);
    30. return root;
    31. }
    • 刚开始 8, 5, 1, 7, 10, 12,方法每次执行,确定本次的根节点和左右子树的分界线

    • 第一次确定根节点为 8,左子树 5, 1, 7,右子树 10, 12

    • 对 5, 1, 7 做递归操作,确定根节点是 5, 左子树是 1, 右子树是 7

    • 对 1 做递归操作,确定根节点是 1,左右子树为 null

    • 对 7 做递归操作,确定根节点是 7,左右子树为 null

    • 对 10, 12 做递归操作,确定根节点是 10,左子树为 null,右子树为 12

    • 对 12 做递归操作,确定根节点是 12,左右子树为 null

    • 递归结束,返回本范围内的根节点

  • 相关阅读:
    MySQL的常用术语
    利用python的Matplotlib库进行基本绘图
    软件开发、网络空间安全、人工智能三个方向的就业和前景怎么样?哪个方向更值得学习?
    【STM32教程】第五章 STM32的定时器
    随着年龄增长,我应该怎样对抗肌肉流失?
    IDEA 快捷键
    el-form添加自定义校验规则校验el-input只能输入数字
    vulnhub靶场之PYLINGTON: 1
    27岁想转行IT,还来的及吗?
    记录:ubuntu安装zlog及使用
  • 原文地址:https://blog.csdn.net/m0_60333804/article/details/133780189