二叉搜索树学习记录

二叉搜索树学习记录

  1. 二叉搜索树简介
    1.1定义
    二叉搜索树(BST)又称二叉查找树或二叉排序树。一棵二叉搜索树是以二叉树来组织的,可以使用一个链表数据结构来表示,其中每一个结点就是一个对象。一般地,除了key之外,每个结点还包含属性leftchild、rightchild和parent,分别指向结点的左孩子、右孩子和双亲(父结点)。如果某个孩子结点或父结点不存在,则相应属性的值为空(NULL)。根结点是树中唯一父指针为NULL的结点,而叶子结点的孩子结点指针也为NULL。
    1.2性质
    在二叉搜索树中:

    ① 若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值;

    ② 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值;

    ③ 任意结点的左、右子树也分别为二叉搜索树。

  2. 二叉搜索树结点类C++代码实现
    每个结点是一个对象,每个对象包含key(关键字)、leftchild(左孩子)、rightchild(右孩子)、parent(父节点)。在C++实现中,我们定义一个结点类Node,同时初始化结点关键字为0,左右孩子和父节点均为NULL。`

class Node{   //结点类Node
private:
double key;         //关键字key
Node leftchild;     //左孩子结点
Node rightchild;     //左孩子结点
Node parent;         //父结点
public Node(double key,Node leftchild,Node rightchild,Node parent)
{
    this.key=key;
    this.leftchild=leftchild;
    this.rightchild=rightchild;
    this.parent=parent;
}};

3.二叉搜索树基本操作实现
对于一个二叉搜索树有很多动态操作,如遍历(walk),添加结点(addNode),删除结点(deleteNode),插入结点(insertNode),查找结点(searchNode)等操作。
3.1 遍历
3.1.1前序遍历(pre_walk)
前序遍历的主要思想是:根节点->左子树->右子树,根据这个思想我们用递归实现,其C++代码如下

public void pre_walk(Node root)
{
if(root!=null)
{
cout<<root.key<<" ";
pre_walk(root.leftchild);
pre_walk(root.rightchild);
}

3.1.2中序遍历(mid_walk)
中序遍历的主要思想是:左子树->根节点->右子树,根据这个思想我们用递归实现,其C++代码如下

public void pre_walk(Node root)
{
if(root!=null)
{
pre_walk(root.leftchild);
cout<<root.key<<" ";
pre_walk(root.rightchild);
}

3.1.3后序遍历(post_walk)
后序遍历的主要思想是:左子树->右子树->根节点,根据这个思想我们用递归实现,其C++代码如下

public void pre_walk(Node root)
{
if(root!=null)
{
pre_walk(root.leftchild);
cout<<root.key<<" ";
pre_walk(root.rightchild);
}

3.2查找结点(searchNode)
在二叉搜索树中查找一个具有给定关键字key的结点,需要输入一个指向树根的对象root和一个关键字x,如果这个结点存在,则searchNode返回一个指向关键字为x的结点;否则返回null。

   具体查找过程为:

   ① 从树根开始查找,并沿着这棵树中的一条简单路径向下进行;

   ② 若树为空树,则查找失败,返回null;

   ③ 对于遇到的每个结点,若关键字x等于结点的关键字,查找终止,返回指向结点x的指针;

   ④ 若关键字x小于结点的关键字,则查找在此结点的左子树中继续(根据二叉搜索树的性质,x此时不可能在右子树中);

   ⑤ 对称地,若关键字x大于结点的关键字,则查找在x的右子树中继续(x此时不可能在左子树中);

     ⑥ 若查找至叶子结点后仍未匹配到相等的关键字,则关键字为x的结点不存在,返回null

根据这个思想其C++代码实现如下

//输入所需要查找树的根结点,和所需要查找的值x,输出查找到的结点
public Node searchNode(Node root,double x)
{
if(root==null||x==root.key)
{return root;}
if(x<root.key)
{return searchNode(root.leftchild,x);
else
{return searchNode(root.rightNode,x);}

3.3插入结点(insertNode)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值