654.构造最大二叉树

  1. 要构造一棵树,首先想到递归,一个结点一个结点的构建(包括new该结点,并且确定root->left和root->right)
  2. 根据题意,一棵树的根结点是数组的最大值,因此先找到值最大的数创建一个根节点root;以该值将数组分成左右两棵子树,再对这两棵子树递归的创建它们的根结点;而root->left和root->right就是这两棵子树的根结点,这样就完整确定好了一棵树的根结点root;
  • 代码:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    //当前处理的子树区间[BegIndex, EndIndex)
    TreeNode* travel(vector<int>& nums, int BegIndex, int EndIndex){
        if(BegIndex == EndIndex) return NULL;

        //int MaxVal = nums[BegIndex],
        int MaxValIndex = BegIndex;
        for(int i = BegIndex + 1; i < EndIndex; ++i){
            if(nums[i] > nums[MaxValIndex]){
                //MaxVal = nums[i]; //最大值 = nums[最大索引],因此无需专门更新最大值
                MaxValIndex = i;
            } 
        }
        TreeNode* root = new TreeNode(nums[MaxValIndex]);
        if(EndIndex - BegIndex == 1) return root;

        /*
        //左子树区间[leftBegIndex, leftEndIndex)
        int leftBegIndex = BegIndex;
        int leftEndIndex = MaxValIndex;
        //右子树区间[rightBegIndex, rightEndIndex)
        int rightBegIndex = MaxValIndex + 1;
        int rightEndIndex = EndIndex;
        */
        
        root->left = travel(nums, BegIndex, MaxValIndex);
        root->right = travel(nums, MaxValIndex + 1, EndIndex);

        return root;
    }

    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        return travel(nums, 0, nums.size());
    }
};
  • 注意点:
  1. 对于当前正在处理的一棵子树,可以独立用一个数组描述,但这样每层递归处理的子树都需用一个数组表示,时间+空间均不好;
    优化策略:类似用数组构造二叉树的题目,每次分组尽量不要定义新的数组,而是通过一对下表索引范围直接在原数组上操作,这样可以节约时间和空间上的开销;
  2. 注意维护循环不变量,该题使用[ ),不同的区间不变量所对应的条件判断也是不同的,只需要从头到尾按照一个走即可;
  3. 递归函数头部的if判空条件,一般情况来说:如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值