代码随想录第20天|二叉树

654.最大二叉树

在这里插入图片描述
在这里插入图片描述
构造二叉树: 使用前序遍历
已理解思路


617.合并二叉树

在这里插入图片描述
虽然开辟额外空间, 但结果依旧受到原来的数影响(当为null时直接借用了原来数的节点)

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if (root1 == nullptr) return root2;
        if (root2 == nullptr) return root1;

        TreeNode* tem = new TreeNode();
        tem->val += root1->val;
        tem->val += root2->val;

        tem->left = mergeTrees(root1->left, root2->left);
        tem->right = mergeTrees(root1->right, root2->right);

        return tem;
    }
};

700.二叉搜索树中的搜索

你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null
在这里插入图片描述
需要利用二叉搜索树的性质

  • 在这里插入图片描述
  • 如果 root->val < val, 往右搜索
  • 如果 root->val > val, 往左搜索
//当寻找到值时, 会立刻弹栈返回
class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if (root == nullptr) return nullptr;

        TreeNode* result = nullptr;
        if (root->val < val) {
            result = searchBST(root->right, val);
        } else if (root->val > val) {
            result = searchBST(root->left, val);
        } else {
            result = root;
        }
        return result;
    }
};

98.验证二叉搜索树

在这里插入图片描述
在这里插入图片描述
备注:

  • 在中序遍历下, 输出的数组是一个递增数组, 只需要验证是否是递增即可

  • 不能只比较左节点小于中间节点, 右节点大于中间节点

  • 需要比较的是左子树所有节点小于中间节点, 右子树所有节点大于中间节点

  • 在这里插入图片描述

  • 什么时候需要返回值

  • 在这里插入图片描述

思路: 暴力解法
直接中序遍历构造数组即可

思路: 递归解法

//使用最小值标志
class Solution {
public:
    // int pre_val = INT_MIN;
    long long pre_val = numeric_limits<long long>::min();
    bool isValidBST(TreeNode* root) {
        if (root == nullptr) return true;

        bool res1 = isValidBST(root->left);

        if (pre_val < root->val) { // 从小到大!!!
            pre_val = root->val;
        } else {
            return false;
        }

        bool res2 = isValidBST(root->right);

        return res1 && res2;
    }
};

//避免使用最小值
class Solution {
public:
    TreeNode* pre = nullptr;
    bool isValidBST(TreeNode* root) {
        if (root == nullptr)
            return true;

        bool res1 = isValidBST(root->left);

        if (pre == nullptr) {
            pre = root;
        } else if (pre->val < root->val) {
            pre = root;
        } else {
            return false;
        }
	
		//简便写法
	 	//if (pre != NULL && pre->val >= root->val) return false;
        //pre = root; // 记录前一个节点

        bool res2 = isValidBST(root->right);

        return res1 && res2;
    }
};
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值