算法训练营 第二十三天

算法训练营 第二十三天

二叉树 day09 最后一天啦!二叉树大成!

669.修剪二叉搜索树

我写这道题的时候,就是按照递归的三步走法则,想清楚输入输出和终止条件以及遍历顺序。
函数输入输出:
输入结点和最大最小边界,返回修建好的树的根节点
终止条件:
1、如果当前结点需要修剪
如果结点大于最大边界,向左搜索
如果结点小于最小边界,向右搜索
2、如果当前结点不用修剪
向左搜索
向右搜索
然后就做出来啦~

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if (root == nullptr)
            return root;
        if (root->val < low) {
            return trimBST(root->right, low, high);
        }
        if (root->val > high)
            return trimBST(root->left, low, high);
        root->left = trimBST(root->left, low, high);
        root->right = trimBST(root->right, low, high);
        return root;
            
    }
};

108.将有序数组转换为二叉搜索树

同样的,想清楚输入输出和递归终止条件就行
输入输出:
输入一个数组,返回构造好的二叉搜索树的根节点
终止条件:
1、如果输入数组是空的,返回空结点

class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        if (nums.size() == 0)
            return nullptr;
        int index = nums.size() / 2;
        vector<int>left(nums.begin(), nums.begin() + index);
        vector<int>right(nums.begin() + index + 1, nums.end());
        TreeNode* root = new TreeNode(nums[index]);
        root->left = sortedArrayToBST(left);
        root->right = sortedArrayToBST(right);
        return root;
    }
};

538. 把二叉搜索树转换为累加树

遍历顺序:右中左

输入输出:输入根节点,返回新的根节点

额外需要一个值保存遍历过的结点总值
终止条件:如果结点为空,则返回

class Solution {
public:
    TreeNode* convertBST(TreeNode* root) {
        if(root==nullptr)
            return root;
        convertBST(root->right);
        root->val += sum;
        sum = root->val;
        convertBST(root->left);
        return root;

        
    }
int sum = 0;
};

二叉树总结

二叉树的遍历方法

深度优先遍历:前中后序遍历 可递归可迭代
广度优先遍历:层序遍历,一般用迭代

二叉树的属性

  • 对称
  • 最大深度
  • 最小深度
  • 求总结点数量
  • 是否是平衡二叉树
  • 找到所有路径(涉及回溯思想)
  • 求左叶子之和
  • 求左下角的值
  • 求路径总和(和找到所有路径一样)

二叉树的修改和构造

  • 翻转二叉树
  • 构造二叉树
  • 构造最大二叉树
  • 合并两个二叉树

求二叉搜索树的属性

  • 二叉搜索树的搜索
  • 判断是否是二叉搜索树
  • 求二叉搜索树的最小绝对差
  • 求二叉树的众数

二叉树的公共祖先问题

二叉搜索树的修改和构造

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值