108. 将有序数组转换为二叉搜索树
递归法:
cppclass Solution { private: TreeNode* traversal(vector<int>& nums,int left,int right){ if(left>right) return NULL; int mid=left+(right-left)/2; TreeNode* node=new TreeNode(nums[mid]); node->left=traversal(nums,left,mid-1); node->right=traversal(nums,mid+1,right); return node; } public: TreeNode* sortedArrayToBST(vector<int>& nums) { if(nums.size()==0) return NULL; TreeNode* root=traversal(nums,0,nums.size()-1); return root; } };迭代法:
cppclass Solution{ public: TreeNode* sortedArrayToBST(vector<int>& nums){ if(nums.size()==0) return NULL; queue<TreeNode*> quenode; queue<int> queleft; queue<int> queright; TreeNode* root=new TreeNode(0); quenode.push(root); queleft.push(0); queright.push(nums.size()-1); while(!quenode.empty()){ TreeNode* node=quenode.front(); quenode.pop(); int left=queleft.front(); queleft.pop(); int right=queright.front(); queright.pop(); int mid=left+(right-left)/2; node->val=nums[mid]; if(left<=mid-1){ TreeNode* ln=new TreeNode(0); node->left=ln; quenode.push(ln); queleft.push(left); queright.push(mid-1); } if(right>=mid+1){ TreeNode* rn=new TreeNode(0); node->right=rn; quenode.push(rn); queleft.push(mid+1); queright.push(right); } } return root; } };
538. 把二叉搜索树转换为累加树
递归法:
cppclass Solution{ private: int pre=0; TreeNode* traversal(TreeNode* root){ if(!root) return root; root->right=traversal(root->right); root->val+=pre; pre=root->val; root->left=traversal(root->left); return root; } public: TreeNode* convertBST(TreeNode* root){ root = traversal(root); return root; } };迭代法:
cppclass Solution{ public: TreeNode* convertBST(TreeNode* root){ if(!root) return NULL; stack<TreeNode*> stk; TreeNode* cur=root; int pre=0; while(cur||!stk.empty()){ if(cur){ stk.push(cur); cur=cur->right; }else{ cur=stk.top(); stk.pop(); cur->val+=pre; pre=cur->val; cur=cur->left; } } return root; } };
其他:
(1)递归法还是注意维护好开闭区间 ,以及中间的节点被用掉后 ,mid所指向的数据已经被使用,左侧区间 的右边界下标为mid-1,右侧区间的左边界下标为mid+1
(2)迭代法可以用多个不同类型的栈或者队列 来存储所需要的多种参数/变量 ,只需要出栈/出队 时需要的一套参数/变量是对应的就行
(3)通常来说,树的结构 如果有变动 (增 节点、删 节点),就用有返回值的递归 ,如果树的结构并没有变动 (也就是只变了某些节点的值/改 节点、查 节点),就使用没有返回值的递归