ADT(抽象数据类型)--二叉树

二叉树是树的一种特殊形式,它的每个子节点至多具有2个孩子,分别是左孩子和右孩子,另外,每个节点的值比它的左子树的所有节点都大,但比它的右子树的所有节点都小,所以有了这个规则,树中就不会有重复的元素,这个特性也使二叉搜索树成为一种用关键值快速查找数据的优秀工具。

二叉树的操作包括:插入节点、删除节点、查找节点、遍历节点。

虽然二叉树也可以使用静态数组来实现,但是显然使用链表来实现更合理,也更方便,这里就只关心链表的实现了。

typedef int TREE_TYPE;
typedef struct TREE_NODE {
    struct TREE_NODE *left;
    struct TREE_NODE *right;
    TREE_TYPE value;
}TreeNode;

static TreeNode *tree;

void insert(TREE_TYPE value) {
    TreeNode *current;//测试节点
    TreeNode **link;//插入的目标节点

    //从根节点开始寻找插入的位置
    link = &tree;

    //根据二叉树的特点,一直向下寻找合适的插入位置
    while((current = *link) != NULL) {
        if (value < current->value) {
            link = &current->left;
        } else {
            assert(current->value != value);//不能重复
            link = &current->right;
        }
    }

    //创建新节点
    current = malloc(sizeof(TreeNode));
    assert(current != NULL);

    current->value = value;
    current->left = NULL;
    current-
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二叉树是一种重要的数据结构,它由一个根节点和左右两个子树组成,每个子树也是一个二叉树。下面是二叉树的抽象类型定义ADT二叉树ADT定义: 1. 初始化二叉树 InitTree(&T) 操作结果:构造一个空的二叉树T。 2. 销毁二叉树 DestroyTree(&T) 初始条件:二叉树T已存在。 操作结果:销毁二叉树T。 3. 创建二叉树 CreateTree(&T, definition) 初始条件:二叉树T不存在,definition是用广义表表示的二叉树结构。 操作结果:按definition所给出的广义表创建对应的二叉树T。 4. 判断二叉树是否为空 TreeEmpty(T) 初始条件:二叉树T已存在。 操作结果:若T为空二叉树,则返回true,否则返回false。 5. 获取二叉树的深度 TreeDepth(T) 初始条件:二叉树T已存在。 操作结果:返回T的深度。 6. 获取二叉树的根节点 Root(T) 初始条件:二叉树T已存在。 操作结果:返回T的根节点。 7. 获取指定节点的值 Value(T, cur_e) 初始条件:二叉树T已存在,cur_e是T中某个节点。 操作结果:返回cur_e的值。 8. 设置指定节点的值 Assign(T, cur_e, value) 初始条件:二叉树T已存在,cur_e是T中某个节点。 操作结果:将cur_e的值设置为value。 9. 获取指定节点的父节点 Parent(T, cur_e) 初始条件:二叉树T已存在,cur_e是T中某个节点。 操作结果:返回cur_e的父节点。 10. 获取指定节点的左孩子节点 LeftChild(T, cur_e) 初始条件:二叉树T已存在,cur_e是T中某个节点。 操作结果:返回cur_e的左孩子节点。 11. 获取指定节点的右孩子节点 RightChild(T, cur_e) 初始条件:二叉树T已存在,cur_e是T中某个节点。 操作结果:返回cur_e的右孩子节点。 12. 获取指定节点的左兄弟节点 LeftSibling(T, cur_e) 初始条件:二叉树T已存在,cur_e是T中某个节点。 操作结果:返回cur_e的左兄弟节点。 13. 获取指定节点的右兄弟节点 RightSibling(T, cur_e) 初始条件:二叉树T已存在,cur_e是T中某个节点。 操作结果:返回cur_e的右兄弟节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值