C中二叉排序树的非递归和递归插入操作以及中序遍历代码实现【可运行】

#include <stdio.h>
#include <stdlib.h> typedef int KeyType; typedef struct node
{
KeyType key;
struct node* lchild, * rchild;
}BSTNode, * BSTree;
//二叉排序树递归插入操作
int InsertBST1(BSTree& T, int k) {
if (T == NULL) {//原树为空,新插入的结点为根结点 T = (BSTree)malloc(sizeof(BSTNode));
if (T == NULL) {
return 0;//内存分配失败的情况
}
T->key = k;
T->lchild = T->rchild = NULL;
return 1;//返回1, 插入成功
}
else if (k == T->key) {//树中存在相同关键字的结点,插入失败
return 0;
}
else if (k < T->key) {
return InsertBST1(T->lchild, k); //如果插入的值小于结点的值,则递归插入函数进行查找
}
else {
return InsertBST1(T->rchild, k); //如果插入的值大于结点的值,则递归插入函数进行查找
}
}
//二叉排序树非递归插入操作
int InsertBST2(BSTree& T, KeyType k)
{
BSTree q, s;//新增两个结点q,s
s = (BSTree)malloc(sizeof(BSTNode));//分配一个新节点
if (s == NULL) {
return 0;//内存分配失败的情况
}
s->key = k;//新结点存储的数据为插入的值
s->lchild = NULL;
s->rchild = NULL;
if (T == NULL)//如果当前结点为空则将新分配的结点s赋给当前结点
{
T = s;
return 1;
}
q = T;//
while (q) {//
BSTree p = q;
if (k == q->key){//如果插入的值等于结点的值,则释放新分配出的内存
free(s);
return 0;
}
if (k < q->key){//如果插入的值小于结点的值,则令该结点等于其左孩子结点
q = q->lchild;
if (q == NULL)
p->lchild = s;//如果该结点的还在结点等于空,则令其孩子结点等于结点s,否则继续找孩子为空的结点
}
else {//如果插入的值大于结点的值,则令该结点等于其右孩子结点
q = q->rchild;
if (q == NULL)
p->rchild = s;//如果该结点的还在结点等于空,则令其孩子结点等于结点s,否则继续找孩子为空的结点
}
}
q = s;
return 1; }
void CreateBST(BSTree &T)
{
KeyType key;
T = NULL;
scanf_s("%d", &key);
while (key!=0)
{
InsertBST2(T, key);
//InsertBST1(T, key);
scanf_s("%d", &key);
}
}
void InOrder(BSTree T)
{
if (T != NULL)
{ InOrder(T->lchild);
printf("%d ", T->key);//这个前置为先序遍历,后置为后序遍历
InOrder(T->rchild);
}
}
int main()
{
BSTree T;
printf("建立二叉排序树,请输入序列:\n");
CreateBST(T);
printf("中序遍历输出序列为:");
InOrder(T);
}
//34
//25
//56
//79
//12
//38
//先序遍历输出序列为:34 25 12 56 38 79
//中序遍历输出序列为:12 25 34 38 56 79
//后序遍历输出序列为:12 25 38 79 56 34

结果为

C中二叉排序树的非递归和递归插入操作以及中序遍历代码实现【可运行】的更多相关文章

  1. IOS中在自定义控件(非视图控制器)的视图跳转中 代理方法与代码块的比较

    //代码块与代替代理的设计方法 我就以在自定义视图中(非视图控制器,不能实现视图控制功能),通过代理和代码块两种方法分别实现视图的跳转,进行对比 首先自定义了一个视图,上面有一个已经注册了得BUtto ...

  2. 在SQL Server 2005中连接Oracle,完成查询、插入操作

    建立指向Oracle的连接假设Oracle数据库的用户名为test,密码为test,在SQL Server数据库所在服务器上建立的指向Oracle数据库的服务命名为hisorcl.1. 在SQL Se ...

  3. 二叉树中序遍历,先序遍历,后序遍历(递归栈,非递归栈,Morris Traversal)

    例题 中序遍历94. Binary Tree Inorder Traversal 先序遍历144. Binary Tree Preorder Traversal 后序遍历145. Binary Tre ...

  4. 【LeetCode-面试算法经典-Java实现】【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】

    [145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a bin ...

  5. 未经处理的异常在 System.Data.dll 中发生。其它信息:在应使用条件的上下文(在 &#39;***&#39; 附近)中指定了非布尔类型的表达式。

    机房收费系统中,有些人在联合查询这个模块用的是存储过程.我先尝试着在数据库中建立了一个视图.然后在UI层做个推断并生成查询条件strCondition. 在机房收费系统的"联合查询" ...

  6. leetcode 257. 二叉树的所有路径 包含(二叉树的先序遍历、中序遍历、后序遍历)

    给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / \2 3 \ 5 输出: ["1->2->5", & ...

  7. 【LeetCode】105. Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...

  8. 二叉树的先序、中序以及后序遍历(递归 && 非递归)

    树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...

  9. 前序 中序 后序 遍历 递归 非递归算法 java实现

    前序遍历 非递归 public void preordernorec(TreeNode root){ //System.out.println("先序遍历(非递归):"); //用 ...

随机推荐

  1. Ubuntu通过iptables防止ssh暴力破解

    步骤 安装iptables-persistent用于保存iptables规则 配置iptables规则 实时更新iptables规则以拦截IP访问 安装iptables-persistent sudo ...

  2. [C#.NET 拾遗补漏]09:数据标注与数据校验

    数据标注(Data Annotation)是类或类成员添加上下文信息的一种方式,在 C# 通常用特性(Attribute)类来描述.它的用途主要可以分为下面这三类: 验证 Validation:向数据 ...

  3. 深入理解golang:Context

    一.背景 在golang中,最主要的一个概念就是并发协程 goroutine,它只需用一个关键字 go 就可以开起一个协程,并运行. 一个单独的 goroutine运行,倒也没什么问题.如果是一个go ...

  4. 在自己电脑上查看git远程分支列表比实际云端的远程分支要多一些

    问题 最近打开一个很久没有打开过的项目,使用git branch -a查看了一下所以分支,其中有些远程分支没有什么用了 于是准备去gitlab上删除它,结果到gitlab上发现没有这些分支,猜测是自己 ...

  5. vue的二级联动,数据是从php获取到的

    1.首先,一级要有change改变事件的关键字,v-on:change="selectarr($event)" 这是created(){}函数里面的自动调用一级分类的数据 html ...

  6. 扩展、接管MVC都不会,还会用Spring Boot?

    持续原创输出,点击上方蓝字关注我 目录 前言 Spring Boot 版本 如何扩展MVC? 如何自定义一个拦截器? 什么都不配置为什么依然能运行MVC相关的功能? 如何全面接管MVC?[不推荐] 为 ...

  7. JVM(五):JVM模型与GC

    确定垃圾 引用计数(存在循环引用问题) 根可达算法 常见的垃圾回收算法 标记清除算法-位置不连续,产生碎片 拷贝算法- 没有碎片,浪费空间 标记压缩-没有碎片,效率偏低(多线程需要进行线程同步,单线程 ...

  8. 多测师讲解rf--定位元素--高级讲师肖sir

    注意点: 注意点: rfbug:rf 点击勾选一个运行就运行两个出现用例执行 注释快捷键: 改字体大小: 快捷键:显示关键字信息 (ctrl+鼠标悬浮) 注解不能空格在注解 未保存提示 定位方法 : ...

  9. 4-20mA模拟量采集

    4-20mA模拟量采集 4-20mA模拟量采集可选卓岚ZLAN6802(485)/ZLAN6842(以太网)/ZLAN6844(无线wifi)他们不仅可以可采集4~20mA还可以采集 /0~5V/0~ ...

  10. jsoncpp笔记

    Json Json是一种轻量级数据交换格式,可以表示数字,字符串,布尔值,null,数组,键值对: { "encoding" : "UTF-8", " ...