二叉树的结构十分有利于递归和分治这个组合思想发挥作用。
比如,一道经典的题目是——
翻转二叉树
后序遍历,分治+递归。
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(!root){
return nullptr;
}
TreeNode* left = invertTree(root->left);
TreeNode* right = invertTree(root->right);
root->left = right;
root->right = left;
return root;
}
};
以及非常经典的,有序数组转平衡二叉搜索树。
为了尽可能“平衡”,我们每次总是选择数组中间的数字作为root,然后分而治之。
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return buildTree(nums,0,nums.size()-1);
}
TreeNode* buildTree(vector<int> nums,int left,int right){
if(left>right) return nullptr;
int mid = left+(right-left)/2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = buildTree(nums,left,mid-1);
root->right = buildTree(nums,mid+1,right);
return root;
}
};