定义
一棵二叉搜索树是以一棵二叉树来组织的,如下图。这样一棵树可以使用一个链表数据结构来表示,其中每个节点就是一个对象。除了key和卫星数据之外,每个节点还包含属性left、right和p,他们分别指向节点的左孩子、右孩子和双亲(父节点)。如果某个孩子节点和父节点不存在,则相应属性的值为NIL。根节点是树中唯一父指针为NIL的节点。[来源:算法导论 第三版]
性质
二叉搜索树中的关键字总是以满足二叉搜索树性质的方式来存储:
设x是二叉搜索树中的一个节点。
如果y是x左子树中的一个节点,那么y.key <= x.key。
如果y是x右子树中的一个节点,那么y.key >= x.key。
二叉搜索树性质允许我们通过一个简单的递归算法来实现按序输出二叉搜索树中的所有关键字,这种算法称为中序遍历(inorder tree walk)算法。这样命名的原因是输出的子树根的关键字位于其左子树的关键字值和右子树的关键字值之间。(类似地,先序遍历(前序遍历,preorder tree walk)中输出的根的关键字在其左右子树的关键字之前,而后序遍历(postorder tree walk)输出的根的关键字在其左右子树的关键字值之后)调用下面的过程INORDER-TREE-WALK(T.root)[伪代码段],就可以输出一棵二叉搜索树T中的所有元素。
INORDER-TREE-WALK(x)
if x != NIL
INORDER-TREE-WALK(x.left)
print x.key
INORDER-TREE-WALK(x.right)
前序遍历:根结点 -> 左子树 -> 右子树
中序遍历:左子树 -> 根结点 -> 右子树
后序遍历:左子树 -> 右子树 -> 根结点
/*
代码来源:
https://github.com/xiexiexx/BIDS/blob/master/set/binary_tree.cpp
*/
template <typename T>
struct tnode {
T data;
tnode<T>* left;
tnode<T>* right;
tnode<T>* parent;
};
template <typename iterator>
void pre_order(iterator p) //前序遍历
{
if (p != NULL)
{
cout << p->data << ' ';
pre_order(p->left);
pre_order(p->right);
}
}
template <typename iterator>
void in_order(iterator p) //中序遍历 中序遍历的顺序在横轴上的投影
{
if(p != NULL)
{
in_order(p->left);
cout << p->data << ' ';
in_order(p->right);
}
}
template <typename iterator>
void post_order(iterator p) //后序遍历
{
if(p != NULL)
{
post_order(p->left);
post_order(p->right);
cout << p->data << ' ';
}
}
[未完...]