bool is_bstree(treenode * root)
{
if (root == NULL)
{
return true;
}
queue<treenode * > q;
q.push(root);
while (!q.empty())
{
root = q.front();
q.pop();
if (root->left != NULL)
{
if (root->left->val < root->val)
{
q.push(root->left);
}
else
return false;
}
if (root->right != NULL)
{
if (root->right->val>root->val)
{
q.push(root->right);
}
else
return false;
}
}
return true;
}
bool find_bstree(treenode *root,int key)
{
if (root == NULL)
return false;
if (root->val == key)
return true;
if (key > root->val)
return find_bstree(root->right, key);
if (key < root->val)
return find_bstree(root->left, key);
}
bool nice_find_bstree(treenode *root, int key)
{
if (root == NULL)
return false;
queue<treenode *> q;
q.push(root);
while (!q.empty())
{
root = q.front();
q.pop();
if (root->val == key)
return true;
if (key > root->val)
{
if (root->right)
q.push(root->right);
}
if (key < root->val)
{
if (root->left)
q.push(root->left);
}
}
return false;
}
void insert_bstree(treenode *root, int key)
{
if (root == NULL)
{
root = new treenode(key);
return;
}
queue<treenode *> q;
q.push(root);
while (!q.empty())
{
root = q.front();
q.pop();
if (root->val == key)
return ;//有就不插
if (key > root->val)
{
if (root->right)
q.push(root->right);
else
{
root->right = new treenode(key);
return;
}
}
if (key < root->val)
{
if (root->left)
q.push(root->left);
else
{
root->left = new treenode(key);
return;
}
}
}
}
bool delete_bstree(treenode *root, int key)
{
if (root == NULL)
return false;
treenode *par = root;
treenode *p = root;
while (p != NULL)
{
if (p->val == key)
{
if (p->left == NULL &&p->right == NULL)
{
if (par->left == p)
par->left = NULL;
else if (par->right == p)
par->right = NULL;
delete p;
}
else if (p->left == NULL)
{
if (par->left == p)
{
par->left = p->right;
}
else
{
par->right = p->right;
}
delete p;
}
else if (p->right == NULL)
{
if (par->left == p)
{
par->left = p->left;
}
else
{
par->right = p->left;
}
delete p;
}
else//找左子树 最右边的结点 或者 右子树 最左边的结点
{
treenode*q = p->left;
par = p;
while (q->right != NULL)
{
par = q;
q = q->right;
}
p->val = q->val;
//删除q
if (q->left != NULL)//q是 否左子树为空
{
if (par->left == q)
{
par->left = q->left;
}
else
{
par->right = q->left;
}
delete q;
}
else//q 是叶子结点
{
if (par->left == q)
par->left = NULL;
else if (par->right == q)
par->right = NULL;
delete q;
}
}
return true;
}
if (p->val > key)
{
par = p;
p = p->left;
}
else if (p->val < key)
{
par = p;
p = p->right;
}
}
return false;
}