又看了一遍BST,把这些基础写了下来。分享一下。代码测试通过。
#include<iostream>
using namespace std;
struct TreeNode{
int val;
TreeNode*left;
TreeNode*right;
TreeNode(int x) :val(x), left(NULL), right(NULL){}
};
TreeNode*MakeEmpty(TreeNode*T)
{
if (T != NULL)
{
MakeEmpty(T->left);
MakeEmpty(T->right);
delete T;
}
return NULL;
}
TreeNode*Find(TreeNode*T, int x)
{
if (T == NULL)return NULL;
if (x<T->val)
return Find(T->left,x);
else
if (x>T->val)
return Find(T->right,x);
else
return T;
}
TreeNode* FindMin(TreeNode*T)
{
if (T == NULL)return NULL;
else
if (T->left == NULL)
return T;
else
return FindMin(T->left);
//if(T) return T->val;
}
int FindMin2(TreeNode*T)
{
if (T == NULL)return -1;
//is T->left
while (T->left != NULL)
{
T = T->left;
}
return T->val;
}
TreeNode*newNode(int elem)
{
TreeNode*current = new TreeNode(elem);
current->left = NULL;
current->right = NULL;
return current;
}
TreeNode*Insert(TreeNode*T, int elem)
{
if (T == NULL)
return newNode(elem);
/*if(T==NULL)
{
T=malloc(sizeof(TreeNode));
if(T==NULL)
FatalError("Out of space");
else
{
T->val=elem;
T->left=T->right=NULL;
}
}*/
if (elem <= T->val)
T->left = Insert(T->left, elem);
else
T->right = Insert(T->right, elem);
return T;
}
TreeNode*Delete(TreeNode*T, int x)
{
TreeNode*Temp;
if (T == NULL)return NULL;
else if (x<T->val)
T->left = Delete(T->left, x);
else if (x>T->val)
T->right = Delete(T->right, x);
else//find element to be deleted
if (T->right && T->left)
{
Temp = FindMin(T->right);
T->val = Temp->val;
T->right = Delete(T->right, T->val);
}
else//one of zero children
{
Temp = T;
if (T->left == NULL)
T=T->right;
else if (T->right == NULL)
T = T->left;
delete Temp;
}
return T;
}
void Print(TreeNode*T)
{
if (T == NULL)return;
Print(T->left);
cout << T->val<<" ";
Print(T->right);
}
int main()
{
int A[] = {5,3,8,1,4,7,9,6,10};
TreeNode*root = nullptr;
for (int i = 0; i < 9; i++)
root = Insert(root, A[i]);
Print(root);
cout << endl;
/*int min_n = FindMin2(root);
cout << min_n << endl;
TreeNode*cur = FindMin(root);
if (cur)
cout << cur->val;
else
cout << "错误";*/
root = Delete(root, 6);
Print(root);
}
具体的每个小函数的测试代码测试过后就删除了,就剩下一个测试delete的了。
最后附上一个斯坦福的学习资料感觉不错。BinaryTree