C中二叉排序树的非递归和递归插入操作以及中序遍历代码实现【可运行】
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中二叉排序树的非递归和递归插入操作以及中序遍历代码实现【可运行】的更多相关文章
- IOS中在自定义控件(非视图控制器)的视图跳转中 代理方法与代码块的比较
//代码块与代替代理的设计方法 我就以在自定义视图中(非视图控制器,不能实现视图控制功能),通过代理和代码块两种方法分别实现视图的跳转,进行对比 首先自定义了一个视图,上面有一个已经注册了得BUtto ...
- 在SQL Server 2005中连接Oracle,完成查询、插入操作
建立指向Oracle的连接假设Oracle数据库的用户名为test,密码为test,在SQL Server数据库所在服务器上建立的指向Oracle数据库的服务命名为hisorcl.1. 在SQL Se ...
- 二叉树中序遍历,先序遍历,后序遍历(递归栈,非递归栈,Morris Traversal)
例题 中序遍历94. Binary Tree Inorder Traversal 先序遍历144. Binary Tree Preorder Traversal 后序遍历145. Binary Tre ...
- 【LeetCode-面试算法经典-Java实现】【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】
[145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a bin ...
- 未经处理的异常在 System.Data.dll 中发生。其它信息:在应使用条件的上下文(在 '***' 附近)中指定了非布尔类型的表达式。
机房收费系统中,有些人在联合查询这个模块用的是存储过程.我先尝试着在数据库中建立了一个视图.然后在UI层做个推断并生成查询条件strCondition. 在机房收费系统的"联合查询" ...
- leetcode 257. 二叉树的所有路径 包含(二叉树的先序遍历、中序遍历、后序遍历)
给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / \2 3 \ 5 输出: ["1->2->5", & ...
- 【LeetCode】105. Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...
- 二叉树的先序、中序以及后序遍历(递归 && 非递归)
树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...
- 前序 中序 后序 遍历 递归 非递归算法 java实现
前序遍历 非递归 public void preordernorec(TreeNode root){ //System.out.println("先序遍历(非递归):"); //用 ...
随机推荐
- OAuth 2.0 Server PHP实现示例
需求实现三方OAuth2.0授权登录 使用OAuth服务OAuth 2.0 Server PHP 环境nginx mysqlphp 框架Yii 一 安装 项目目录下安装应用 composer.phar ...
- 使用appium后安卓手机无法调出键盘解决方法
问题:用appium进行真机调试后,使用手机的app进行输入时无法调出键盘. 原因:appium调试时,将手机输入法设置成了Unicode IME 解决方法: 方法一,手机设置里修改输入法: 不同的手 ...
- lua 1.1 源码阅读总结
GC 1. 怎么回收的lua 中所有已经分配的数据都会用一些指令的数据结构来记录,当需要回收时,先遍历当前栈内所有 object,把 ref 标志位打上 1,遍历符号表(这部分不能回收),反符号表中的 ...
- Signature Scanning(中文暂时译为"特征码扫描")是在C++(起码我是用C++^^)开发中很好的一种方式
1.介绍 本文主要简单介绍在没有代码的情况下,如何从一个动态链接库中获取某个函数的址.主要实现方式为Signature Scanning(特征码扫描) 2.什么是Signature Scanning( ...
- 利用Python求解二元一次方程
本程序流程如下: (1)输入A.B.C (2)计算△ (3)判断解的个数 (4)计算解 (5)输出解 求:x2-3x+2=0的解 #输入A.B.C A=float(input("输入A:&q ...
- React Ref 其实是这样的
大家好,我是Mokou,好久没有冒泡了,最近一直在看研究算法和数据结构方面的东西,但是似乎很多前端不喜欢看这种东西,而且目前本人算法方面也很挫,就不献丑了. 当然了,最近也开始研究React了,这篇文 ...
- 如何从0到1的构建一款Java数据生成器-第一章
前提 某天晚上老夫在神游时,想起白天公司同事说起的问题,这老表抱怨使用mysql生成大批的随机测试数据太过麻烦,问大家有没有好的工具推荐,老夫对这种事情当然不关心,毕竟我也不知道. 秉承着不懂就要问, ...
- Storm入门教程汇总
http://www.aboutyun.com/thread-8059-1-1.html
- Web调优之IBM JDK+liberty(一): Jmeter pod里压力,50个线程并发测试,调整 -Xms -Xms, Log原来是大问题
1.运行环境 k8s Web服务器: Liberty(IBM J9 JDK),base image : FROM websphere-liberty:20.0.0.3-kernel-java8-ibm ...
- Linux命令行history
概述 当执行命令后,系统默认会在内存记录执行过的命令 当用户正常退出时,会将内存的命令历史存放对应历史文件中,默认是~/.bash_history 登录shell时,会读取命令历史文件中记录下的命令加 ...