代码随想录算法训练营第19天|654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

本文介绍了如何使用前序遍历构造最大二叉树,通过递归方式分割数组并构造节点;同时讲解了合并两个二叉树和在二叉搜索树中搜索以及验证二叉搜索树的方法,涉及中序遍历和双指针技巧。
摘要由CSDN通过智能技术生成

654.最大二叉树代码

思路:构造二叉树一般都用前序遍历,中左右,可以优先处理构造中节点,再递归构造左右子树。

题解分步:

第一步.找到该数组中最大的元素,并记录其数组下标(方便分割数组),也是切割点。

第二步.中,构造该最大值的节点 

第三步.左,把切割点(不包含切割点)左边的数组传入递归构造左子树

第四步.右,切割点右边数组传入递归构造右子树

最后,返回其根节点

注:分割数组必须遵循循环不变量原则,下面分割区间是左边右开

代码:

 TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        if(nums.size()==1){//如果当前数组只有一个元素直接返回节点
            TreeNode* node = new TreeNode(nums[0]);
            return node;
        }
        //找数组中的最大值
        int MaxValue = 0;//存放最大值
        int MaxValueindex = 0;//记录最大值的数组下标,方便后续左右数组切割
        for(int i = 0;i < nums.size();i++){
            if(nums[i] > MaxValue){
                MaxValue = nums[i];
                MaxValueindex = i;
            }
        }
        //中
        TreeNode* node = new TreeNode(MaxValue);
        //左,切割点左边至少要有一个元素才可以构造节点
        if(MaxValueindex > 0){
            vector<int> newVec(nums.begin(),nums.begin() + MaxValueindex);//切割左数组,区间左闭右开,[0,MaxValueindex)
            node->left = constructMaximumBinaryTree(newVec);//构造左子树
        }
        //右,切割点右边至少要有一个元素
        if(MaxValueindex < (nums.size() - 1)){
            vector<int> newVec(nums.begin() + MaxValueindex + 1,nums.end());//切割右数组,区间左闭右开,[MaxValueindex+1,end)
            node->right = constructMaximumBinaryTree(newVec);//构造右子树
        }

        return node;
    }

617.合并二叉树

思路:合并两颗二叉树可以看作构造一颗新二叉树,比较直观的遍历顺序是前序,中后序也可以。

代码:

TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        //节点1为空,2不为空,则把2节点返回;
        if(root1 == nullptr) return root2;
        if(root2 == nullptr) return root1;
        //中,节点12都不为空,两值相加到一个新节点
        TreeNode* root = new TreeNode(root1->val + root2->val);
        //左
        root->left = mergeTrees(root1->left,root2->left);
        //右
        root->right = mergeTrees(root1->right,root2->right);

        return root;
    }

700.二叉搜索树中的搜索

代码:

TreeNode* searchBST(TreeNode* root, int val) {
        //中,值相等则找到子树,若找不到该值的节点,root会遍历到空节点,直接返回该节点null即可
        //注:条件左右顺序不能反,不能访问空指针的val
        if(root == nullptr || root->val == val) return root;
        //左  
        if(root->val > val) return searchBST(root->left,val);
        //右
        if(root->val < val) return searchBST(root->right,val);

        return nullptr;
    }

98.验证二叉搜索树

解1:二叉搜索树的特性可以用前序遍历,可以得到一个单调递增的序列,遍历完整颗树再判断数组是否单增。

解2:利用双指针,pre记录前一个节点,再与当前root节点比较数组,因为中序遍历,所以符合条件的二叉搜索树的值:左<中<右,也就是pre的值<root的值。否则就不是二叉搜索树

代码:

TreeNode* pre = nullptr;//记录前一个节点
    bool isValidBST(TreeNode* root) {
        if(root == nullptr) return true;//空节点也符合二叉搜索树
        //左
        bool left = isValidBST(root->left);
        //中
        if(pre!=nullptr && pre->val >= root->val) return false;
        pre = root;
        //右
        bool right = isValidBST(root->right);

        return left && right;//仅当左右子树都符合条件
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值