二叉树系列汇总,持续更新!

相关文章汇总:

  • 动态规划系列汇总,持续更新!
  • 最小路径和问题汇总,持续更新!
  • 跳跃游戏系列汇总,持续更新!

一、构造二叉树

// Definition for a binary tree node.
struct TreeNode
 {
     
     int val;
     TreeNode *left;
     TreeNode *right;
     TreeNode() : val(0), left(nullptr), right(nullptr) {
     }
     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {
     }
     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {
     }
 };

二、递增顺序搜索树

题目

给你一棵二叉搜索树,请你按中序遍历将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,
并且每个节点没有左子节点,只有一个右子节点。

二叉树系列汇总,持续更新!_第1张图片
二叉树系列汇总,持续更新!_第2张图片

解题

class Solution {
     
public:

    //将二叉搜索树转换为一个排序好的vector
    void orderTree2vector(TreeNode *node, vector<int> &vec)
    {
     
        if(node==nullptr) return;

        orderTree2vector(node->left, vec);
        vec.push_back(node->val);
        orderTree2vector(node->right, vec);
    }

    //将二叉搜索树转换成递增顺序搜索树
    TreeNode* increasingBST(TreeNode* root) {
     
        vector <int>vec;
        orderTree2vector(root, vec);
        //创建一个新的节点
        TreeNode *newNode = new TreeNode(-1);
        TreeNode *currNode = newNode;

        for(int value: vec)
        {
     
            currNode->right = new TreeNode(value);
            currNode = currNode->right;
        }
        return newNode->right;
    }
};

复杂度分析:

  • 时间复杂度:O(n),其中 n 是二叉搜索树的节点总数。
  • 空间复杂度:O(n),其中 n 是二叉搜索树的节点总数。需要长度为 n 的列表保存二叉搜索树的所有节点的值。

提交结果:
二叉树系列汇总,持续更新!_第3张图片


三、二叉搜索树范围和(LeetCode 938)

题目

给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。

提示:
树中节点数目在范围 [1, 2 * 104] 内
1 <= Node.val <= 105
1 <= low <= high <= 105
所有 Node.val 互不相同

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/range-sum-of-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二叉树系列汇总,持续更新!_第4张图片
二叉树系列汇总,持续更新!_第5张图片

题解

本题可以通过中序遍历将二叉树中的值按顺序存储到一个数组中,然后再计算[low, high]之间的数的和,但是并不推荐这么做。我们可以利用二叉搜索树本身的结构,以及有序性的性质 ,利用更小的复杂度来解决本题。

解法:深度优先搜索

按深度优先搜索的顺序计算范围和。记当前子树根节点为 root,分以下四种情况讨论:

  • root 节点为空,说明已经搜索到叶子节点(没有子节点),返回0。
  • root 节点的值 root->value > high,则无需考虑右子树,返回左子树的范围和。
  • root 节点的值 root->value < low,则无需考虑左子树,返回右子树的范围和。
  • root 节点的值 low< root->value < high 此时应返回 root 节点的值、左子树的范围和、右子树的范围和这三者之和。

C++实现如下:

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

复杂度分析:

  • 时间复杂度:O(n),其中 nn 是二叉搜索树的节点数。
  • 空间复杂度:O(n)。空间复杂度主要取决于栈空间的开销。

四、二叉搜索树的第k大节点

题目

给定一棵二叉搜索树,请找出其中第k大的节点。

限制:
1 ≤ k ≤ 二叉搜索树元素个数

原题:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/

二叉树系列汇总,持续更新!_第6张图片

题解

class Solution {
     
public:
	// 倒序遍历二插入,将数字从大到小存入数组vec中
    void orderTree2vector(TreeNode* root, vector<int> &vec)
    {
     
        if(root==nullptr) return;
        orderTree2vector(root->right, vec);
        vec.push_back(root->val);
        orderTree2vector(root->left, vec);
    }
	// 取vec的第k大数即可
    int kthLargest(TreeNode* root, int k) {
     
        vector<int> vec;
        orderTree2vector(root, vec);
        return vec[k-1];
    }
};

你可能感兴趣的:(算法与数据结构,二叉树,算法,数据结构,leetcode)