[学习][数据结构]二叉搜索树

定义

一棵二叉搜索树是以一棵二叉树来组织的,如下图。这样一棵树可以使用一个链表数据结构来表示,其中每个节点就是一个对象。除了key和卫星数据之外,每个节点还包含属性left、rightp,他们分别指向节点的左孩子、右孩子和双亲(父节点)。如果某个孩子节点和父节点不存在,则相应属性的值为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 << ' ';
    }
}

[未完...]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值