一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的结点。
说白了就是无论是对整棵树还是其某棵子树,左子树的节点都比根节点小,右子树的节点都比根节点大
#include<stdio.h>
#include<stdlib.h>
typedef struct BinarySortTreeNode
{
int data; //数据域
struct BinarySortTreeNode *lChild; //左子树
struct BinarySortTreeNode *rChild; //右子树
}BSTNode;
/**
insertBSTNode() 插入节点
node:树节点,须使用指针的引用(如果是C语言也可以用二级指针),意图修改地址
element:节点数据域值
**/
void insertBSTNode(BSTNode * &node, int element)
{
if (NULL == node)
{
node = new BSTNode;
node->data = element;
node->lChild = NULL;
node->rChild = NULL;
return;
}
if (node->data == element) // 不允许两个相同值的节点
{
return;
}
if (element < node->data)
{
insertBSTNode(node->lChild, element);
}
if (element > node->data)
{
insertBSTNode(node->rChild, element);
}
}
void preOrder(BSTNode *root) // 先序遍历
{
if (root)
{
printf("%d ", root->data);
preOrder(root->lChild);
preOrder(root->rChild);
}
}
void inOrder(BSTNode *root) // 中序遍历
{
if (root)
{
inOrder(root->lChild);
printf("%d ", root->data);
inOrder(root->rChild);
}
}
void initBST(BSTNode *&root, int ele[], int len) //创建二叉查找树,也要使用指针的引用
{
if (NULL == ele || 0 == len)
{
return;
}
for (int i = 0; i < len; i++)
{
insertBSTNode(root, ele[i]);
}
}
void freeTree(BSTNode *&root) //释放节点
{
if (NULL == root)
{
return;
}
freeTree(root->lChild);
freeTree(root->lChild);
delete root;
root = NULL;
}
int main()
{
int ele[] = { 5,3,8,7,2,9,1,10,6,4 };
int len = sizeof(ele) / sizeof(ele[0]);
BSTNode *root = NULL;
initBST(root,ele,len);
printf("先序遍历:DLR:根左右:");
preOrder(root);
printf("\n中序遍历:LDR:左根右:");
inOrder(root);
printf("\n");
freeTree(root);
system("pause");
return 0;
}
运行结果:
根据中序遍历和任一遍历,可以画出唯一的二叉树,方式就不提了。
可以看出:
先序遍历:5 3 2 1 4 8 7 6 9 10
中序遍历:1 2 3 4 5 6 7 8 9 10
后序遍历:1 2 4 3 6 7 10 9 8 5
这棵树也是一棵二叉排序树。