Every day a leetcode
题目来源:701. 二叉搜索树中的插入操作
解法1:迭代
首先回顾二叉搜索树的性质:对于任意节点 root 而言,左子树(如果存在)上所有节点的值均小于 root->val,右子树(如果存在)上所有节点的值均大于 root->val,且它们都是二叉搜索树。
因此,当将 val 插入到以 root 为根的子树上时,根据 val 与 root->val 的大小关系,就可以确定要将 val 插入到哪个子树中。
- 如果该子树不为空,则问题转化成了将 val 插入到对应子树上;
- 否则,在此处新建一个以 val 为值的节点,并链接到其父节点 root 上。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* createTreeNode(int val)
{
struct TreeNode* node=malloc(sizeof(struct TreeNode));
node->val=val;
node->left=NULL;
node->right=NULL;
return node;
}
struct TreeNode* insertIntoBST(struct TreeNode* root, int val){
// 特判空树
if(root == NULL)
{
root=createTreeNode(val);
return root;
}
struct TreeNode* pos=root;
while(pos)
{
// 若pos->val>val,插入pos的左子树
if(pos->val>val)
{
// pos->left不为空,在左子树中继续找插入位置
if(pos->left) pos=pos->left;
// 否则,直接插入
else
{
pos->left=createTreeNode(val);
break;
}
}
// 插入pos的右子树
else
{
// pos->right不为空,在右子树中继续找插入位置
if(pos->right) pos=pos->right;
// 否则,直接插入
else
{
pos->right=createTreeNode(val);
break;
}
}
}
return root;
}
结果:
解法2:递归
从解法1中,我们能发现递归的特性。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* createTreeNode(int val)
{
struct TreeNode* node=malloc(sizeof(struct TreeNode));
node->val=val;
node->left=NULL;
node->right=NULL;
return node;
}
struct TreeNode* insertIntoBST(struct TreeNode* root, int val){
// 特判空树
if(root == NULL)
{
root=createTreeNode(val);
return root;
}
// 若pos->val>val,插入pos的左子树
if(root->val>val)
{
root->left=insertIntoBST(root->left,val);
}
// 否则,插入pos的右子树
else
{
root->right=insertIntoBST(root->right,val);
}
return root;
}
结果: