二叉树插入算法的非递归版本
首先约定结点和元素类型的的定义:
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;}}}}
}
但是这种插入操作,问题本身是递归的,最简洁的是用递归算法,但是递归算法虽然简单,但是需要更多的理解才能大胆的用起来。
这次只讨论非递归的算法实现。
以上。
二叉树插入算法的非递归版本相关推荐
- python实现冒泡排序算法的非递归版本_冒泡排序以及python代码实现(递归+非递归)...
一.冒泡排序 比较简单的排序算法,适合小规模数据集,效率较低. 依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面. 每进行一趟排序,就会少比较一个数 python代码(非递归): fro ...
- python实现冒泡排序算法的非递归版本_python排序算法速度比较:快速排序,归并排序,冒泡排序...
前言 原理就不在这里说了,好多大神肯定比我这个初学者讲的好很多,推荐去B站看视频讲解,跟着手敲代码 为什么选这三个排序呢? 首先快排是必须掌握的 看看快排在最坏的情况下(O(n²)),且不使用辅助空间 ...
- 数据结构--Avl树的创建,插入的递归版本和非递归版本,删除等操作
AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值最多为1(空树的高度为-1). 也就是说,AVL树,本质上是带了平 ...
- 二叉树(2)——遍历的非递归实现
2019独角兽企业重金招聘Python工程师标准>>> 算法概述 递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍 ...
- 给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1)
给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1) template<typename T> void insert_recursive(BinaryTree< ...
- 实现二叉树的三种非递归遍历算法
[问题描述] 编写程序,实现二叉树的三种非递归遍历算法:先序非递归,中序非递归,后序非递归. [输入形式] 输入建树序列. [输出形式] 输出三种遍历序列. [样例输入] A B C # # # # ...
- 二叉树的前序,中序,后续(非递归版本)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.前序 二.后序 三.中序 总结 前言 二叉树的非递归版本的前序中序后序在面试中也经常考,必须熟练掌握! 下面将会讲 ...
- 二叉树的中序遍历(递归和非递归版本)
难易程度:★★ 重要性:★★★★★ 树结构是面试中的考察的重点,而树的遍历又是树结构的基础.中序遍历的非递归版本要求重点理解掌握. /*** 非递归版本的中序遍历* node指向待处理的节点,在中序遍 ...
- 二叉树后序遍历(非递归)
原文地址为: 二叉树后序遍历(非递归) 二叉树的递归遍历算法就不用说了:在非递归算法中,后序遍历难度大,很多书上只给出思想或者几段无法直接调试的代码,甚至有些书上是错的,当时我在研究的过程中,就是按着 ...
最新文章
- 如何判断添加的一个面要素是否与某一个面图层相交(AO)
- C# DataTable转ListModel通用类
- iOS 图形编程总结
- mac终端shell颜色
- 安装hexo,建站并新建博客
- 【GoLang】golang中可以直接返回slice吗?YES
- ubuntu14.04中mysql的安裝及utf8编码集配置
- 生命计算机在线,抖音生命计算器
- bootstrap-datetimepicker.js与IE8的兼容问题
- 计算机的冷门知识课件,PPT竟然还能这么玩!7组超实用冷门PPT小技巧
- 空洞卷积详解(输入输出大小分析)
- excel vba批量发送邮件
- go语言读取xls表格xls文件操作替代解决方案
- The requested URL * was not found on this server. 的解决方法
- 1000+常用Python库
- base64的pdf编码转换成pdf文件转换之后一直打不开:未能加载pdf
- 第06章 Tableau仪表板和故事
- 谈谈局域网监控软件,网和外网有什么区别...
- Spring Cloud Netflix中文文档翻译笔记
- 获取微信昵称时 过滤特殊字符
热门文章
- STL vector简介
- Linux 下安装Eclipse C++
- C# Readonly和Const的区别
- 【学习OpenCV4】在OpenCV中响应键盘与鼠标操作
- jni hook java_java通过jni调用hook无效
- python string转int_Python编程入门:time模块常用技巧
- mysql的多媒体类型_多媒体数据库技术及其发展方向
- android 边框重叠,android - Android:recyclerview中的viewitems轮廓与recyclerview边框重叠 - 堆栈内存溢出...
- 交换机虚拟化和堆叠的区别_交换机级联与堆叠有何区别
- 西安计算机技校专业,西安计算机软件工程学校哪里好|西安铁道技师学院计算机软件工程专业|西安计算机学校怎么样?|西安中专学校...