首先约定结点和元素类型的的定义:

typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{ElementType Data;BinTree Left;BinTree Right;
};

对于二叉树的插入算法,从原理上理解是很简单自然的:我们首先需要考虑的是树是空树该怎么办,这是问题的起点。因此,当树是空的,那么当前插入的值就是根结点的元素值。肯定不能直接把元素直接丢在那里,需要用结点的标准形式封装起来。即:

if(BST == NULL) // 是一棵空树的时候,插入的结点就是根结点
{Position node = (Position)malloc(sizeof(struct TNode));node->Left = NULL;node->Right = NULL;node->Data = X; //标准的初始化结点语句BST = node; //根结点指向这个新建的结点return BST; //老实返回去即可
}

如果一般情况下,树中已经有部分结点了,我们知道,二叉树的左结点小于根,根结点小于右边的结点,这是一个递归的性质。因此,想插入一个新的结点,即需要不断和其他结点比较。这个其他结点具体指代什么呢?首先,进来是和根结点比,如果比根结点小,那么就往左走,再和根节点的左子树的根节点比较,假如此时比左子树的根结点值小,不是说就直接插到它的左边结点,为什么呢?因为左子树的左结点可能不是空的啊!因为比左子树的根结点小,所以还是得往左边走。如果恰好左子树的左边没有结点,那就OK,加入到这个位置。

往右边走也是相似的道理。

下面是完整代码:

// 函数Insert将X插入二叉搜索树BST并返回结果树的根结点指针;
BinTree Insert( BinTree BST, ElementType X ) //循环版本的插入算法
{if(BST == NULL) // 是一棵空树的时候,插入的结点就是根结点{Position node = (Position)malloc(sizeof(struct TNode));node->Left = NULL;node->Right = NULL;node->Data = X;BST = node;return BST;}else{Position node = BST;while(1){if(X == node->Data){return NULL; //错误,退出}if(X < node->Data){if(node->Left != NULL){node = node->Left;}else{Position temp = (Position)malloc(sizeof(struct TNode));temp->Left = NULL;temp->Right = NULL;temp->Data = X;node->Left = temp;return BST;}}else{if(node->Right != NULL){node = node->Right;}else{Position temp = (Position)malloc(sizeof(struct TNode));temp->Left = NULL;temp->Right = NULL;temp->Data = X;node->Right = temp;return BST;}}}}
}

但是这种插入操作,问题本身是递归的,最简洁的是用递归算法,但是递归算法虽然简单,但是需要更多的理解才能大胆的用起来。
这次只讨论非递归的算法实现。

以上。

二叉树插入算法的非递归版本相关推荐

  1. python实现冒泡排序算法的非递归版本_冒泡排序以及python代码实现(递归+非递归)...

    一.冒泡排序 比较简单的排序算法,适合小规模数据集,效率较低. 依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面. 每进行一趟排序,就会少比较一个数 python代码(非递归): fro ...

  2. python实现冒泡排序算法的非递归版本_python排序算法速度比较:快速排序,归并排序,冒泡排序...

    前言 原理就不在这里说了,好多大神肯定比我这个初学者讲的好很多,推荐去B站看视频讲解,跟着手敲代码 为什么选这三个排序呢? 首先快排是必须掌握的 看看快排在最坏的情况下(O(n²)),且不使用辅助空间 ...

  3. 数据结构--Avl树的创建,插入的递归版本和非递归版本,删除等操作

    AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值最多为1(空树的高度为-1). 也就是说,AVL树,本质上是带了平 ...

  4. 二叉树(2)——遍历的非递归实现

    2019独角兽企业重金招聘Python工程师标准>>> 算法概述 递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍 ...

  5. 给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1)

    给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1) template<typename T> void insert_recursive(BinaryTree< ...

  6. 实现二叉树的三种非递归遍历算法

    [问题描述] 编写程序,实现二叉树的三种非递归遍历算法:先序非递归,中序非递归,后序非递归. [输入形式] 输入建树序列. [输出形式] 输出三种遍历序列. [样例输入] A B C # # # # ...

  7. 二叉树的前序,中序,后续(非递归版本)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.前序 二.后序 三.中序 总结 前言 二叉树的非递归版本的前序中序后序在面试中也经常考,必须熟练掌握! 下面将会讲 ...

  8. 二叉树的中序遍历(递归和非递归版本)

    难易程度:★★ 重要性:★★★★★ 树结构是面试中的考察的重点,而树的遍历又是树结构的基础.中序遍历的非递归版本要求重点理解掌握. /*** 非递归版本的中序遍历* node指向待处理的节点,在中序遍 ...

  9. 二叉树后序遍历(非递归)

    原文地址为: 二叉树后序遍历(非递归) 二叉树的递归遍历算法就不用说了:在非递归算法中,后序遍历难度大,很多书上只给出思想或者几段无法直接调试的代码,甚至有些书上是错的,当时我在研究的过程中,就是按着 ...

最新文章

  1. 如何判断添加的一个面要素是否与某一个面图层相交(AO)
  2. C# DataTable转ListModel通用类
  3. iOS 图形编程总结
  4. mac终端shell颜色
  5. 安装hexo,建站并新建博客
  6. 【GoLang】golang中可以直接返回slice吗?YES
  7. ubuntu14.04中mysql的安裝及utf8编码集配置
  8. 生命计算机在线,抖音生命计算器
  9. bootstrap-datetimepicker.js与IE8的兼容问题
  10. 计算机的冷门知识课件,PPT竟然还能这么玩!7组超实用冷门PPT小技巧
  11. 空洞卷积详解(输入输出大小分析)
  12. excel vba批量发送邮件
  13. go语言读取xls表格xls文件操作替代解决方案
  14. The requested URL * was not found on this server. 的解决方法
  15. 1000+常用Python库
  16. base64的pdf编码转换成pdf文件转换之后一直打不开:未能加载pdf
  17. 第06章 Tableau仪表板和故事
  18. 谈谈局域网监控软件,网和外网有什么区别...
  19. Spring Cloud Netflix中文文档翻译笔记
  20. 获取微信昵称时 过滤特殊字符

热门文章

  1. STL vector简介
  2. Linux 下安装Eclipse C++
  3. C# Readonly和Const的区别
  4. 【学习OpenCV4】在OpenCV中响应键盘与鼠标操作
  5. jni hook java_java通过jni调用hook无效
  6. python string转int_Python编程入门:time模块常用技巧
  7. mysql的多媒体类型_多媒体数据库技术及其发展方向
  8. android 边框重叠,android - Android:recyclerview中的viewitems轮廓与recyclerview边框重叠 - 堆栈内存溢出...
  9. 交换机虚拟化和堆叠的区别_交换机级联与堆叠有何区别
  10. 西安计算机技校专业,西安计算机软件工程学校哪里好|西安铁道技师学院计算机软件工程专业|西安计算机学校怎么样?|西安中专学校...