递归1(带返回值)
1、确定递归函数参数以及返回值
TreeNode* insertIntoBST(TreeNode* root, int val)
2、确定终止条件
终⽌条件就是找到遍历的节点为null的时候,就是要插⼊节点的位置了,并把插⼊的节点返回。
if (root == NULL) {
TreeNode* node = new TreeNode(val);
return node;
}
这⾥把添加的节点返回给上⼀层,就完成了⽗⼦节点的赋值操作了,详细再往下看。
3、确定单层递归的逻辑
此时要明确,需要遍历整棵树么?
遍历整棵搜索树简直是对搜索树的侮辱,哈哈哈
if(val>root->val){
root->right= insertIntoBST(root->right,val);
}
else if(val<root->val){
root->left= insertIntoBST(root->left,val);
}
整体代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root==NULL) {
TreeNode* node=new TreeNode(val);
return node;
}
if(val>root->val){
root->right= insertIntoBST(root->right,val);
}
else if(val<root->val){
root->left= insertIntoBST(root->left,val);
}
return root;
}
};
递归二(不带返回值)
版本一:
class Solution {
public:
void traversal(TreeNode* cur,int val){
if(val>cur->val){
if(cur->right) traversal(cur->right,val);
else {
cur->right =new TreeNode(val);
return;
}
}else{
if(cur->left) traversal(cur->left,val);
else {
cur->left =new TreeNode(val);
return;
}
}
}
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root==NULL){
TreeNode* node=new TreeNode(val);
return node;
}
traversal(root,val);
return root;
}
};
版本二
class Solution {
private:
TreeNode* father;
void traversal(TreeNode* cur,int val){
if(cur==NULL){
TreeNode* node =new TreeNode(val);
if(val>father->val) father->right=node;
else if(val<father->val) father->left=node;
return;
}
father=cur;
if(val>cur->val) traversal(cur->right,val);
if(val<cur->val) traversal(cur->left,val);
}
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root==NULL){
TreeNode* node=new TreeNode(val);
return node;
}
traversal(root,val);
return root;
}
};
迭代法
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root==NULL){
TreeNode* node=new TreeNode(val);
return node;
}
TreeNode* pre=NULL;
TreeNode* cur=root;
while(cur!=NULL){
if(val>cur->val){
pre=cur;;
cur=cur->right;
}else{
pre=cur;
cur=cur->left;
}
}
TreeNode* node= new TreeNode(val);
if(val>pre->val) pre->right=node;
else pre->left=node;
return root;
}
};