vlambda博客
学习文章列表

二叉树刷题篇(完) 二叉搜索树的修剪、构造与转换

669. 修剪二叉搜索树


给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树不应该改变保留在树中的元素的相对结构(即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在唯一的答案。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

https://leetcode-cn.com/problems/trim-a-binary-search-tree/


class Solution {public: TreeNode* trimBST(TreeNode* root, int low, int high) { if(root==NULL) return NULL; if(root->val<low){ TreeNode* right=trimBST(root->right, low, high); return right; } if(root->val>high){ TreeNode* left=trimBST(root->left, low, high); return left; } root->left=trimBST(root->left,low,high); root->right=trimBST(root->right,low,high); return root; }};
这题并不算太难,只要避免了直接删除不合条件的节点的错误即可。(即,仅仅是遇到了不合条件的节点将其删除是并不够的,还需要将符合条件的节点再链接到树上)

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

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/
在之前的 106. 从中序与后序遍历序列构造二叉树 中,已经知道了如何去构造二叉树。
这道题的要求是构造一个高度平衡二叉搜索树,很显然用有序数组的中间的数值作为根节点,不断将数组拆分为更小数组,从而完成构造二叉树,而这样的二叉树,一定是高度平衡二叉搜索树。
同样,在这题之中,可以使用left与right来避免重复声明vector的问题。
class Solution {private: TreeNode* traversal(vector<int>& nums, int left, int right) { if (left > right) return NULL; int mid = left + ((right - left) / 2);  TreeNode* root = new TreeNode(nums[mid]); root->left = traversal(nums, left, mid - 1); root->right = traversal(nums, mid + 1, right); return root; }public: TreeNode* sortedArrayToBST(vector<int>& nums) { TreeNode* root = traversal(nums, 0, nums.size() - 1); return root; }};

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

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

https://leetcode-cn.com/problems/convert-bst-to-greater-tree
很显然,对于任意一个节点来说,大于等于node.val的值之和就是它自身与它的右孩子的节点之和。
首先想到的思路应当是按照右-左-中遍历数组,并且进行累加值的记录并赋给节点。
class Solution {public: void traversal(TreeNode* cur,int &sum){ if(cur==NULL) return; traversal(cur->right,sum); sum+=cur->val; cur->val=sum; traversal(cur->left,sum); } TreeNode* convertBST(TreeNode* root) { int sum=0; traversal(root,sum); return root; }};
完美通过,这题居然也算medium……基本没有难度。
好了,二叉树就先复习到这里了,从明天开始学习回溯算法。
哎,要开学了,论文不知道怎么发,不知道能不能顺利毕业,就业也不知道该如何去办,短短的两年,我又感受到了那种紧张的感觉。
愿一切顺利!