自学内容网 自学内容网

刷题计划day17 二叉树(七)【 从中序与后序遍历序列构造二叉树】【从中序与后序遍历序列构造二叉树】【最大二叉树】

⚡刷题计划day17 二叉树(七)继续,二叉树会有十期专题,可以点个免费的赞哦~

往期可看专栏,关注不迷路,

您的支持是我的最大动力🌹~

目录

题目一:106. 从中序与后序遍历序列构造二叉树

题目二:106. 从中序与后序遍历序列构造二叉树

题目三:654. 最大二叉树


题目一:106. 从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树

https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/

此题题解参考leetcode即可,推荐:106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)题解

class Solution {
     HashMap<Integer,Integer> inorderArrayMap = new HashMap<>();
     int[] post;
     
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        for(int i=0;i<inorder.length;i++){
            inorderArrayMap.put(inorder[i],i);//将节点值及索引全部记录在哈希表中
        }
        post = postorder;
        TreeNode root = buildTree(0,inorder.length-1,0,post.length-1);
        return root;
    }
    
    public TreeNode buildTree(int inorderStart,int inorderEnd,int postorderStart,int postorderEnd){
​
        if(inorderStart>inorderEnd || postorderStart>postorderEnd){
            return null;
        }
        int root = post[postorderEnd];//根据后序遍历结果,取得根节点
        int rootIndexInInorderArray = inorderArrayMap.get(root);//获取对应的索引
​
        TreeNode node = new TreeNode(root);//创建该节点
        node.left = buildTree(inorderStart,rootIndexInInorderArray-1,postorderStart,postorderStart+rootIndexInInorderArray-inorderStart-1);
        node.right = buildTree(rootIndexInInorderArray+1,inorderEnd,postorderStart+rootIndexInInorderArray-inorderStart,postorderEnd-1);
        return node;
    }
}

题目二:106. 从中序与后序遍历序列构造二叉树

  1. 从中序与后序遍历序列构造二叉树

https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/

class Solution {
    HashMap<Integer,Integer> inorderArrrayMap = new HashMap<>();
    int[] pre;
​
    public TreeNode buildTree(int[] preorder, int[] inorder) {
​
        for(int i=0;i<inorder.length;i++){
            inorderArrrayMap.put(inorder[i],i);
        }
        pre = preorder;
        TreeNode root = buildTree(0,inorder.length-1,0,preorder.length-1);
        return root;
    }
    public TreeNode buildTree(int inorderStart,int inorderEnd,int preorderStart,int preorderEnd){
        if(inorderEnd<inorderStart || preorderEnd<preorderStart){
            return null;
        }
        int root = pre[preorderStart];
        int rootArrayIndex = inorderArrrayMap.get(root);
​
        TreeNode node = new TreeNode(root);
        int leftLength = rootArrayIndex-inorderStart;
        node.left = buildTree(inorderStart,rootArrayIndex-1,preorderStart+1,preorderStart+leftLength);
        node.right = buildTree(rootArrayIndex+1,inorderEnd,preorderStart+leftLength+1,preorderEnd);
        return node;
        
    }
}

题目三:654. 最大二叉树

  1. 最大二叉树

(https://leetcode.cn/problems/maximum-binary-tree/description/)

根据题目,我们很容易会想到通过递归的方式对本题进行解答。因为无论是拆分出来左子数组还是右子数组,那么对于子数组的操作,依然都是一样的逻辑。所以,初步思路上面,我们首先确定以递归的方式进行解题。

递归三部曲:

1.确定递归函数的参数和返回值

参数需要穿入数组,然后我们需要以当前数组的最大值进行分割,所以还需要下标索引,然后需要返回根节点。

然后还需要一个通用的方法进行查找当前数组的最大值下标,我们可以抽象出来。

TreeNode build(int[] nums,int startIndex,int endIndex)
int maxIndex(int[] nums,int startIndex,int endIndex)

2.确定终止条件

当开始下标>结束下标,说明此部分数组为空,返回null值即可。

3.确定单层递归的逻辑

找到数组最大值对应下标,然后最大值构造根节点,使用下标进一步分割数组,

具体代码如下:

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return build(nums,0,nums.length-1);
​
    }
    public TreeNode build(int[] nums,int startIndex,int endIndex){
​
      if(startIndex>endIndex){
          return null;
      }
      int maxIndex = maxIndex(nums,startIndex,endIndex);
      TreeNode newNode = new TreeNode(nums[maxIndex]);
      newNode.left = build(nums,startIndex,maxIndex-1);
      newNode.right = build(nums,maxIndex+1,endIndex);
      return newNode;
    }
    public int maxIndex(int[] nums,int startIndex,int endIndex){
        int maxIndex = startIndex;
        for(int i=startIndex+1;i<=endIndex;i++){
            maxIndex = nums[maxIndex] < nums[i] ? i : maxIndex;
        }
        return maxIndex;
    }
​
}
​点个免费的赞吧🌹


原文地址:https://blog.csdn.net/weixin_72499901/article/details/143696202

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!