1.二叉树的查找功能的时间复杂度比链表的好

2.删除节点的稍微复杂点

  >没有节点,直接删除

  >只有左节点(或者右节点),直接用该节点的左节点(或者右节点)替代要删除的节点

  >有左节点并且有右节点,用左节点替代

3.二叉树的遍历方式:

/*
1.中序遍历的递归算法定义: 若二叉树非空,则依次执行如下操作: ⑴遍历左子树; ⑵访问根结点; ⑶遍历右子树。[3] 2.先序遍历的递归算法定义: 若二叉树非空,则依次执行如下操作: ⑴ 访问根结点; ⑵ 遍历左子树; ⑶ 遍历右子树。 3.后序遍历得递归算法定义: 若二叉树非空,则依次执行如下操作: ⑴遍历左子树; ⑵遍历右子树; ⑶访问根结点
*/
typedef struct node{
int num;
struct node *left;
struct node *right;
}Node; typedef struct {
Node *root;
}Tree; /**
*@brief 建树
*/
Tree *createTree()
{
Tree *tree = malloc(sizeof(Tree));
tree -> root = NULL;
return tree;
} /**
*@brief 建树的节点
*/
Node *createNode(int num)
{
Node *node = malloc(sizeof(Node));
node -> num = num;
node -> left = NULL;
node -> right = NULL;
return node;
} /**
*@brief 非递归插入
*/
void insert(Tree *tree,int n)
{
if(tree -> root == NULL){
tree -> root = createNode(n);
}else{
Node *p = tree -> root;
Node *parent = NULL;
while(p != NULL)
{
parent = p; // 记录当前移动的位置
if(p -> num < n)
{
p = p -> left;
}
else if(p -> num > n)
{
p = p -> right;
}
else{ // 相等就不再插入
return;
} } // 找到位置后插入
if (n < parent -> num)
{
parent -> left = createNode(n);
}else{
parent -> right = createNode(n);
}
}
} /**
*@brief 递归插入
*/
void insert(Node *node,int n)
{
if(node == NULL){
node = createNode(n);
}
else if(n < node-> num){
node -> left = insert(node -> left, n);
}
else{
node -> right = insert(node -> right, n);
}
} /**
*@brief 查找
*/
Node *search(Tree tree,int n)
{
Node *p = tree -> root;
while(p != NULL)
{
if(n < p -> num)
{
p = p -> left;
}
else if (n > p -> num)
{
p = p -> right;
}
else {
return p;
}
}
return NULL;
} /*
1.中序遍历的递归算法定义: 若二叉树非空,则依次执行如下操作: ⑴遍历左子树; ⑵访问根结点; ⑶遍历右子树。[3] 2.先序遍历的递归算法定义: 若二叉树非空,则依次执行如下操作: ⑴ 访问根结点; ⑵ 遍历左子树; ⑶ 遍历右子树。 3.后序遍历得递归算法定义: 若二叉树非空,则依次执行如下操作: ⑴遍历左子树; ⑵遍历右子树; ⑶访问根结点
*/ /**
*@brief 先序遍历
*@param node tree->root
*/
void preOrder(Node *node)
{
if (node != NULL)
{
printf("%d",node -> num);
preOrder(node -> left);
preOrder(node -> right);
}
} /**
*@brief 中序遍历
*/
void inOrder(Node *node)
{
if (node != NULL)
{
inOrder(node -> left);
printf("%d",node -> num);
inOrder(node -> right);
}
} /**
*@brief 后序遍历
*/
void tailOrder(Node *node)
{
if (node != NULL)
{
tailOrder(node -> left);
tailOrder(node -> right);
printf("%d",node -> num);
}
} /**
*@brief 删除节点
1//只有左节点,则左节点代替他的位置
2//只有右节点,则右节点代替他的位置
3//既有左节点又有右节点,则左子树的最右节点代替原节点
*/
bool deleteNode(Node *node,int n)
{
Node *p = node;
Node *q;
int temp;
while(p != NULL && n != p -> num)
{
q = p;
if(p -> num < n)
{
p = p -> left;
}
else if(p -> num > n)
{
p = p -> right;
}
else{ // 相等就不再插入
}
} if(p == NULL){
printf("没有此元素");
}
else{ // 如果找到要删除的节点
// 1.如果找到的节点,没有左子树和右子树
if(p -> left == NULL && P -> right == NULL)
{
if(p == q -> left)
{
q -> left = NULL;
}
if(p == q -> right)
{
q -> right = NULL;
}
free(p);
p == NULL;
}
// 2.找到节点,但是要删除的节点只有左子树或者右子树
// 2.1 只有左子树
else if (NULL == p -> right && NULL != p -> left)
{
if(p == q ->left)
{
q -> left = p -> left;
}else if(p == q -> right)
{
q ->right = p -> left;
}
free(p);
p = NULL;
}
// 2.2 只有右子树
else if (NULL != p -> right && NULL == p -> left)
{
if(p == q ->left)
{
q -> left = p -> right;
}else if(p == q ->right)
{
q ->right = p -> right;
}
free(p);
p = NULL;
}
// 3.如果查找到的节点,左右子树都有(本代码使用直接前驱,也可以使用直接后继)
else if (NULL != P -> right && NULL != p -> left)
{
Node *s,sParent;
sParent = p;
s = sParent -> left;
while (NULL != s -> right) // 找到p的直接前驱
{
sParent = s;
s = s -> right;
}
temp = s -> num;
deleteNode(node,temp); // 递归
p -> num = temp;
} }
}

第五篇、C_二叉搜索树的更多相关文章

  1. 剑指Offer的学习笔记(C#篇)-- 二叉搜索树的后序遍历序列

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 一 . 解题思想与二叉搜索树概念 (1). 二叉树 ...

  2. leecode第二百三十五题(二叉搜索树的最近公共祖先)

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  3. 数据结构-二叉树(应用篇)-之二叉搜索树 C和C++的实现

    一.概念 二叉搜索树(Binary Sort Tree/Binary Search Tree...),是二叉树的一种特殊扩展.也是一种动态查找表. 在二叉搜索树中,左子树上所有节点的均小于根节点,右子 ...

  4. LeetCode刷题191130 --基础知识篇 二叉搜索树

    休息了两天,状态恢复了一下,补充点基础知识. 二叉搜索树 搜索树数据结构支持许多动态集合操作,包括Search,minimum,maximum,predecessor(前驱),successor(后继 ...

  5. 《剑指offer》第五十四题(二叉搜索树的第k个结点)

    // 面试题54:二叉搜索树的第k个结点 // 题目:给定一棵二叉搜索树,请找出其中的第k大的结点. #include <iostream> #include "BinaryTr ...

  6. 【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)

    目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中 ...

  7. Binary Search-使用二叉搜索树

    终于到二叉树了,每次面试时最担心面试官问题这块的算法问题,所以接下来就要好好攻克它~ 关于二叉树的定义网上一大堆,这篇做为二叉树的开端,先了解一下基本概念,直接从网上抄袭: 先了解下树的概念,bala ...

  8. LeetCode.938-范围内求二叉搜索树节点值之和(Range Sum of BST)

    这是悦乐书的第359次更新,第386篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第221题(顺位题号是938).给定二叉搜索树的根节点,返回节点值在[L,R]之间的所有 ...

  9. 数据结构学习笔记_树(二叉搜索树,B-树,B+树,B*树)

    一.查找二叉树(二叉搜索树BST) 1.查找二叉树的性质 1).所有非叶子结点至多拥有两个儿子(Left和Right): 2).所有结点存储一个关键字: 3).非叶子结点的左指针指向小于其关键字的子树 ...

随机推荐

  1. 转载sql server 关于 default value的一些使用总结

    转载原出处:http://blog.csdn.net/miqi770/article/details/6728733 1.在创建表的时候,给字段添加的默认值约束 CREATE TABLE " ...

  2. 射频识别技术漫谈(15)——Mifare1的安全性及7字节序列号M1卡【worlsing笔记】

    Mifare1的安全性主要指卡中数据的安全性,要求卡中的数据不能被非法修改或窃听.数据的安全性主要使用加密技术来保证,加密技术有两个关键因素:加密算法和密钥.现代加密技术的一大特点是加密算法公开,如果 ...

  3. hdu1863 畅通工程(最小生成树之prim)

    Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可 ...

  4. ASP.Net 使用SqlBulkCopy批量插入

    批量插入,以前我的做法是生成一堆insert into的sql语句,然后用程序一次值行,来实现. 今天看到了ASP.Net里可以使用DataTable,先将数据写入到DataTable中,然后使用Sq ...

  5. 关于iOS中SQLITE句柄的使用的细节

    1.设计思想:给SQLITE进行封装,利用定义的类别实现方法的简洁,以便达到低耦合效果 控制器代码: #import "ViewController.h" #import &quo ...

  6. Ubuntu安装和配置redis

    1.用root用户登录 2.执行 sudo apt-get install redis-server 部分截图

  7. 配置Ubuntu开发环境

    前言 新买了一台ThinkPad E431,主要看中了硬盘500G和7200转/分钟的速度,因此准备从x220上把工作环境迁移到新买的笔记本上. 为什么不要公司的电脑,是由于160G的ssd硬盘实在是 ...

  8. 杭电 2602 Bone Collector

    Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. iOS开发:AVPlayer实现流音频边播边存

    1. AVPlayer简介 AVPlayer存在于AVFoundation中,可以播放视频和音频,可以理解为一个随身听 AVPlayer的关联类: AVAsset:一个抽象类,不能直接使用,代表一个要 ...

  10. ABAP 常用系统变量

    SY-ABCDE 常量,A-Z字母表SY-BATCH 后台的程序运行SY-COLNO:当前选定列的列号SY-CPAGE 列表的当前显示页SY-CUCOL 屏幕,PAI 的水平光标位置SY-CUROW: ...