二插树相关知识

1.删总体思想:

分多种情况讨论
1.被删除节点没有子树的情况,直接删除,并修改对应父节点的指针为空。
2.对于只有一个子树的情况,考虑将其子树作为其父节点的子树,关于是左还是右,根据被删除的节点确定。
3.最复杂的是有两个子数的情况,可以考虑两种方法,都是同样的思想:用被删除节点A的左子树的最右节点或者A的右子树的最左节点作为替代A的节点,并修改相应的最左或最右节点的父节点的指针,修改方法类似2 ,不做细致讨论除二叉树


2.

.


3.

二叉排序树

1、二叉排序树的定义
 
  
二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:
①若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
②若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
③左、右子树本身又各是一棵二叉排序树。
  上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。

2、二叉排序树的特点
  由BST性质可得:
  (1) 二叉排序树中任一结点x,其左(右)子树中任一结点y(若存在)的关键字必小(大)于x的关键字。
  (2) 二叉排序树中,各结点关键字是惟一的。
  注意:
  实际应用中,不能保证被查找的数据集中各元素的关键字互不相同,所以可将二叉排序树定义中BST性质(1)里的"小于"改为"大于等于",或将BST性质(2)里的"大于"改为"小于等于",甚至可同时修改这两个性质。
  (3) 按中序遍历该树所得到的中序序列是一个递增有序序列。
  【例】下图所示的两棵树均是二叉排序树,它们的中序序列均为有序序列:2,3,4,5,7,8。

    

3、二叉排序树的存储结构
typedef int KeyType; //假定关键字类型为整数
typedef struct node { //结点类型
  KeyType key; //关键字项
  InfoType otherinfo; //其它数据域,InfoType视应用情况而定,下面不处理它
  struct node *lchild,*rchild; //左右孩子指针
} BSTNode;
typedef BSTNode *BSTree; //BSTree是二叉排序树的类型


### 的概念 是一种重要的非线性数据结构,其中每个节点最多有两个子节点:左子节点和右子节点。这种特性使得非常适合用于表示层次关系,并且可以高效地执行入、删除和查找操作。 #### 特殊类型的 - **满**:除了最后一层外,每一层上的所有节点都有两个子节点。 - **完全**:除最后一层外,其他各层的节点数都达到最大值;并且最下面一层的节点全部集中在该层最左边的位置上。 - **平衡**:对于任意节点而言,其左右子的高度差不超过1[^3]。 ### C语言中的定义 在C语言中,通常通过结构体来定义节点: ```c typedef struct TreeNode { char data; struct TreeNode* lchild; struct TreeNode* rchild; } BiTree, *BiTreeNode; ``` 这段代码声明了一个名为`TreeNode`的结构体类型,它包含了三个成员变量:存储节点值的`data`字段以及指向左右孩子的指针`lchild`和`rchild`。 ### 使用先序遍历来创建 给定一个字符串序列作为输入,可以通过递归的方式按照先序方式构建一棵。当遇到特定字符(如'#')时表示当前分支为空,则返回NULL终止此路径下的进一步处理。 ```c #include <stdio.h> #include <stdlib.h> // 定义节点结构 typedef struct TreeNode { char data; struct TreeNode* lchild; struct TreeNode* rchild; } BiTree; // 创建新节点函数 BiTree* CreateNode(char val) { BiTree* newNode = (BiTree*)malloc(sizeof(BiTree)); if (!newNode) exit(-1); newNode->data = val; newNode->lchild = newNode->rchild = NULL; return newNode; } // 先序创建 BiTree* CreateBiTree() { printf("Please input node element, and '#' == 'NULL': "); getchar(); char ch; scanf("%c", &ch); if (ch == '#') return NULL; BiTree* T = CreateNode(ch); T->lchild = CreateBiTree(); // 左子 T->rchild = CreateBiTree(); // 右子 return T; } ``` 上述程序实现了基于用户交互式的构造过程,在实际应用中可以根据具体需求调整读取逻辑以适应不同的应用场景[^2]。 ### 层次遍历算法 为了能够逐层访问整棵并打印出各个节点的信息,这里提供了一种利用队列辅助完成的方法——广度优先搜索(BFS),即所谓的“按层遍历”。 ```c void LevelOrderTraversal(BiTree* root) { if (!root) return; BiTree* queue[100]; // 假设最大深度不会超过100 int front = 0, rear = 0; queue[rear++] = root; while(front != rear){ BiTree* current = queue[front++]; printf("%c ", current->data); if(current->lchild!=NULL) queue[rear++]=current->lchild; if(current->rchild!=NULL) queue[rear++]=current->rchild; } } ``` 在这个例子中,使用数组模拟了FIFO行为的简单队列机制来进行节点间的传递工作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值