递归
写递归函数经常出错,提醒自己两个规则:
1. 一般来说递归函数中不应该出现for、while之类的循环语句, 因为递归就是循环的另外一种实现;
2. 注意基线条件,具体参考《算法图解》p32。
一个死循环的递归:
void recurCreate(TreeNode* p, vector<int>& vec, int l, int r){ while (l<r) { int m = l+(r-l)/2; p = new TreeNode(vec[m]); recurCreate(p->left, vec, l, m); recurCreate(p->right, vec, m+1, r); } }
正确的写法:
void recurCreate(TreeNode* p, vector<int>& vec, int l, int r){ if (l>=r) return; else { int m = l+(r-l)/2; p = new TreeNode(vec[m]); recurCreate(p->left, vec, l, m); recurCreate(p->right, vec, m+1, r); } }
指针初始化
TreeNode* sortedArrayToBST(vector<int> &nums) { if(nums.size()==0) return nullptr; TreeNode* root = new TreeNode(0); //新建一个树节点,同时在内存中分配一个地址给它,root指向该地址 TreeNode* root1; //root1指向八荒之外的某个地址(未初始化局部变量,应避免此操作) root1->val = 1; TreeNode* root2 = nullptr; //root2是个空指针,没有指向哪里 root1->val = 2; //空指针是没有内容的,因此这里调用nullptr->val是错的 错的 错的 recurCreate(root, nums, 0, static_cast<int>(nums.size()) ); //递归建立BST,返回root地址 recurCreate(root1, nums, 0, static_cast<int>(nums.size()) ); //root1里啥也没有 recurCreate(root1, nums, 0, static_cast<int>(nums.size()) ); return root; }
未初始化变量的问题参考:C/C++中已初始化/未初始化全局/静态/局部变量/常量在内存中的位置
备注:
本是毫不相关的两个问题,刚好在同一道题里遇到了,leetcode108,完整代码如下:
class Solution { public: void recurCreate(TreeNode* p, vector<int>& vec, int l, int r){ if (l>=r) { return; } else { int m = l+(r-l)/2; p->val = vec[m]; if(l<m){ p->left = new TreeNode(0); recurCreate(p->left, vec, l, m); } if(m+1<r){ p->right = new TreeNode(0); recurCreate(p->right, vec, m+1, r); } } } TreeNode* sortedArrayToBST(vector<int> &nums) { if(nums.size()==0) return nullptr; TreeNode* root = new TreeNode(0); recurCreate(root, nums, 0, static_cast<int>(nums.size()) ); return root; } };