链式二叉搜索树#插入节点#

定义一个二叉树节点的数据结构如下:

typedef struct TREE_NODE
{
    TREE_TYPE value;
    struct TREE_NODE *pLeft;
    struct TREE_NODE *pRight;
}TreeNode;

插入节点的原型为:void insert(TreeNode **pLink,TREE_TYPE data);

如果要将数组元素a[10]={20,12,25,5,16,28,2,17,26,29};

下面分两种情况讨论:

①    :当二叉搜索树为空时。例如插入20节点。如下图所示:

②    :当二叉树不为空时,找到插入节点的位置,例如5节点

while((pCurrent=*pLink) != NULL)

{

if(data<pCurrent->value)

{

pLink =
&(pCurrent->pLeft);

}

else

{

pLink =
&(pCurrent->pRight);

}

}

细说这段代码:首先,pCurrent为一个节点指针,指向20这个节点。

判断5<20,执行:pLink =
&(pCurrent->pLeft);pLink中保存的是20节点中指向左孩子指针的指针,然后执行while((pCurrent=*pLink) != NULL),此时pCurrent指向12节点,pLink为指向12节点指针的指针。

判断5<12, 执行:pLink =
&(pCurrent->pLeft); pLink中保存的是12节点中指向左孩子指针的指针,然后执行while((pCurrent=*pLink) != NULL) ,此时pCurrent为NULL,退出while循环。

此时,pLink指向12节点中指向左孩子指针的指针。因此只需修改 (*pLink) ,即可将节点5插入。注意此时的*pLink==pCurrent;因此pCurrent为空闲指针,可将pCurrent指针指向新分配的节点块。

综合①②:列出源代码

void insert(TreeNode
**pLink,TREE_TYPE data)

{

TreeNode *pCurrent = NULL;

while((pCurrent=*pLink) != NULL)

{

if(data<pCurrent->value)

{

pLink =
&(pCurrent->pLeft);

}

else

{

pLink =
&(pCurrent->pRight);

}

}

pCurrent = (TreeNode
*)malloc(sizeof(TreeNode));

pCurrent->value = data;

pCurrent->pLeft = NULL;
pCurrent->pRight = NULL;

*pLink = pCurrent ;

}

时间: 2024-11-04 17:39:40

链式二叉搜索树#插入节点#的相关文章

链式二叉搜索树#删除节点#

Leetcode 450.删除二叉搜索树的节点

删除二叉搜索树的节点 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变.返回二叉搜索树(有可能被更新)的根节点的引用. 一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点: 如果找到了,删除它. 说明: 要求算法时间复杂度为 O(h),h 为树的高度. 示例: root = [5,3,6,2,4,null,7] key = 3 给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它. 一个正确的答案

二叉搜索树插入算法C#演示的代码

如下内容内容是关于二叉搜索树插入算法C#演示的内容,希望能对大伙有帮助. public class BinaryTreeNode{ public BinaryTreeNode Left { get; set; } public BinaryTreeNode Right { get; set; } public int Data { get; set; } public BinaryTreeNode(int data) { this.Data = data; }} public void Inse

【算法导论】二叉搜索树的插入和删除

上一篇说了有关二叉树遍历的三种方式,文本将继续探讨如何实现二叉搜索树的插入和删除节点. 在继续之前,我们先来了解两个概念:前驱和后继. 一.后继和前驱 后继:如果所有的关键字互不相同,则一个节点x的后继是大于x.key的最小关键字的节点. 前驱:如果所有的关键字互不相同,则一个节点x的前驱是小于x.key的最大关键字的节点. 如果联系二叉搜索树的性质: 节点的key值总是大于它的左节点(如果存在)的key值并且小于它的右节点(如果存在)的key值.那么我们容易推知:如果一个节点有右子树,它后继即

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

这是悦乐书的第359次更新,第386篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第221题(顺位题号是938).给定二叉搜索树的根节点,返回节点值在[L,R]之间的所有节点的值的总和.二叉搜索树的节点值唯一.例如: 输入:root = [10,5,15,3,7,null,18],L = 7,R = 15 输出:32 输入:root = [10,5,15,3,7,13,18,1,null,6],L = 6,R = 10 输出:23 注意: 树中的节点数最多为1000

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值

二叉搜索树JavaScript实现

* 什么是二叉搜索树?其形式就是二叉树,对于每个节点x,其左子树的值<=x.value,右子树的值>=x.value. * 对于二叉搜索树,我们可以使用中序遍历,得到树上从小到大所有的元素.时间复杂度平均为O(n). function inorderTreeWalk(x) { if(x!== null) { inorderTreeWalk(x.left); print(x.key); inorderTreeWalk(x.right); } } * 当我们想要查询二叉搜索树中某个关键字应该怎么做

计蒜客课程竞赛入门--二叉搜索树 流程记

二叉搜索树插入删除演示地址: http://www.cs.usfca.edu/~galles/visualization/BST.html 细心的你应该发现了,二叉搜索树的每个节点都要比左边的子孙节点的值要大,比右边的要小.二叉搜索树的中序遍历就是将整棵树按从小到大的顺序输出.是不是很神奇^o^ 如何在二叉搜索树中查找某个元素呢?首先从根出发,如果和根的值相等,则返回根,否则如果比根小就去左孩子,如果比根大就去右孩子,依次递归进行,直到找到值或者找不到返回空. 那么插入操作呢?紧接着上面的查找算

二叉搜索树JAVA实现

引入: 二叉搜索树是这样的一种二叉树: (1)每个元素都有一个关键值,并且没有任意两个元素有相同的关键值 (2)根节点的左子树中任意元素的关键值小于根节点的关键值. (3)根节点的右子树中任意元素的关键值大于根节点的关键值. (4)根节点的左右子树也是二叉搜索树. 我们这里就用程序来实现这样一颗二叉搜索树. 分析: 从定义看出,二叉搜索树是一种特殊的二叉树,它给每个元素加上了序的概念,但又不同于最大最小堆,它总是 左<根<右的.我们分别看常用的几个操作. 查找: 关键值查找很简单,就是从根元素