1. 程式人生 > >[LeetCode]修剪二叉搜尋樹(剪枝+二叉樹+遞迴)

[LeetCode]修剪二叉搜尋樹(剪枝+二叉樹+遞迴)

題目

給定一個二叉搜尋樹,同時給定最小邊界L 和最大邊界 R。通過修剪二叉搜尋樹,使得所有節點的值在[L, R]中 (R>=L) 。你可能需要改變樹的根節點,所以結果應當返回修剪好的二叉搜尋樹的新的根節點。

思路

遞迴。
首先判斷當前節點的value與邊界之間的關係。如果是空,則終止遞迴,直接返回空。如果節點的值小於L則返回節點的右子樹,如果節點的值大於R則返回其右節點呼叫遞迴函式的值。如果節點的值小於L則返回其左節點呼叫遞迴函式的值。最後,如果節點的值在範圍內則將左右節點呼叫遞迴函式的值賦值給其左右節點,並返回該節點。

程式碼

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution { public: TreeNode* trimBST(TreeNode* root, int L, int R) { if (root == NULL) return NULL; if (root->val < L) return trimBST(root->right, L, R); if (root->val > R) return trimBST(root->left, L, R); root->left = trimBST(root->left, L, R); root->right = trimBST(root->right, L, R); return
root; } };