排序二叉树有如下性质:
1、若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2、若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
3、左、右子树也分别为二叉排序树
struct BT//表示结点,定义一个结构名为BT,每个结点为BT类型,具有三个属性
{
int val;//当前节点的值
BT* left;//定义一个名为left的指针,指向BT类型的结点
BT* right;//定义一个名为right的指针,指向BT类型的结点
};
struct Tree//定义一个树结构
{
BT *root;//定义一个名为boot的指针,指向BT类型的结点,表示根结点
};
void insert(Tree* tree, int val)//形参为指向tree的指针
{
BT* temp, *newnode;
newnode = new BT;//为newnode开辟一个新的BT空间
newnode->val = val;
newnode->right = NULL;//初始化为一个空
newnode->left = NULL;//
if (tree->root==NULL)//如果现在的树为空的树,当前的点为根
{
tree->root = newnode;
}
else
{
temp = tree->root;//temp从根节点开始判断要插入的位置,将当前值与temp值比较,
while (NULL != temp)//若大于temp,则判断temp的右儿子存不存在,存在就重新赋值temp,继续进行比较
{
if (temp->val<newnode->val)
{
if (temp->right==NULL)
{
temp->right = newnode;
return;
}
else
{
temp = temp->right;
}
}
else
{
if (temp->left == NULL)
{
temp->left = newnode;
return;
}
else
{
temp = temp->left;
}
}
}
}
}
void preorder(BT* ptr)//根左右,即先访问根节点,再访问左结点,最后访问右结点
{
if (ptr != NULL)
{
cout << ptr->val << " ";
preorder(ptr->left); //实际上是一个递归的过程
preorder(ptr->right);
}
}
int main()
{
Tree tree;//定义一个类型为tree的树
BT* b1 = new BT; //由于树的根结点为指向BT的指针,故需要定义一个指针类型的结点,开辟一个空间
b1->val =10; //初始化
b1->left = new BT; //结点的left也是一个指针,开辟一个空间
b1->left->val = 9;//初始化
b1->left->left = NULL;//指针为空
b1->left->right = NULL;
b1->right = new BT;
b1->right->val = 11;
b1->right->left = NULL;
b1->right->right = NULL;
tree.root = b1;
preorder(tree.root);
cout << endl;
Tree* to_tree = &tree;
insert(to_tree, 20);
preorder(tree.root);
cout << endl;
return 0;
}
运算结果: