二叉排序树

数据结构与算法—二叉排序树(java)

蓝咒 提交于 2019-11-28 00:12:01
前言 前面介绍学习的大多是线性表相关的内容,把指针搞懂后其实也没有什么难度。规则相对是简单的。 再数据结构中 树 、 图 才是数据结构标志性产物,(线性表大多都现成api可以使用),因为树的 难度相比线性表大一些 并且树的 拓展性很强 ,你所知道的树、二叉树、二叉排序树,AVL树,线索二叉树、红黑树、B数、线段树等等高级数据结构。然而二叉排序树是所有的基础,所以彻底搞懂二叉排序树也是非常重要的。 树 参考王道数据结构 二叉树也是树的一种,而二叉排序树又是二叉树的一种。 树是 递归 的,将树的任何一个节点以及节点下的节点都能组合成一个 新的树 。并且很多操作基于递归完成。 根节点: 最上面的那个节点(root),根节点 没有前驱节点 ,只有子节点(0个或多个都可以) 层数: 一般认为根节点是 第1层 (有的也说第0层)。而树的高度就是层数最高(上图层数开始为1)节点的层数 节点关系: 父节点 :就是链接该节点的上一层节点, 孩子节点: 和父节点对应,上下关系。而 祖先节点 是父节点的父节点(或者祖先)节点。 兄弟节点: 拥有同一个父节点的节点们! 度: 节点的度就是节点拥有 孩子节点 的个数(是孩子不是子孙).而树的度(最大)节点的度。同时,如果度大于0就成为 分支节点 ,度等于0就成为 叶子节点 (没有子孙)。 相关性质: 树的节点数=所有节点度数+1. 度为m的树第i层最多有mi

D12-二叉排序树[Java数据结构和算法]

╄→尐↘猪︶ㄣ 提交于 2019-11-27 18:51:48
1.二叉排序树(BST;Binary Sort(Search)Tree)   1.1对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大;当有两个相同的值时,可以放在左子节点或右子节点; 2.二叉排序树删除节点   2.1删除叶子节点   (1)找到要删除的节点targetNode;   (2)找到targetNode的父节点parent;   (3)确定targetNode是parent的左子节点还是右子节点;   (4)根据步骤(3)的情况对应删除节点;   2.2 删除只有一颗子树的节点   (1)找到要删除的节点targetNode;   (2)找到targetNode的父节点parent;   (3)确定targetNode的子节点是左子节点还是右子节点;   (4)确定targetNode是parent的左子节点还是右子节点;   (5)如果targerNode有左子节点     (5.1)targetNode是parent的左子节点:parent.left=targetNode.left;     (5.2)targetNode是parent的右子节点:parent.right=targetNode.left;   (6)如果targerNode有右子节点     (6.1)targetNode是parent的左子节点

98-Validate Binary Search Tree

我是研究僧i 提交于 2019-11-27 18:49:05
题目:验证一个二叉树是否为二叉排序树 def isValidBST(root): inorder = inorder(root) return inorder == list(sorted(set(inorder))) def inorder(root): if root is None: return [] return inorder(root.left) + [root.val] +inorder(root.right) 注: 采用遍历二叉树的中序遍历,如果结果为排序,则说明该二叉树是二叉排序树 来源: https://www.cnblogs.com/kingshine007/p/11372974.html

【算法•日更•第四十五期】静态二叉排序树(建立)

蹲街弑〆低调 提交于 2019-11-27 15:35:47
▎前言   小编虽然已经会了二叉排序树,但是却不明白静态二叉排序树和二叉排序树有什么关系。   结合平衡二叉排序树(例如:红黑树)食用本篇博客,效果更佳哦~    传送门 (同时也内含二叉排序树的相关知识) ▎静态二叉排序树 ☞ 『引入』   这个东西要从线段树说起 ,别问我为什么扯这么远 。    戳这里快速上手线段树 。   不得不说,线段树是个好东西,每次都会把一个区间劈成左右两半,运用了分治的思想。   但是线段树更多的是用来处理区间类的问题,在遇到数据点统计问题的时候,也能算出来,不过多保留了一下一些冗余的东西。   比如说:线段树总是定义过多的l,r,mid指针来指向区间,这就是冗余信息;   再比如说:线段树的节点是用来存储区间的,而在处理点的问题时,是不需要的,这就是冗余信息。   还有:在处理点时,线段树的区间一分为二,是通过一个分割点的,只要保留这个分割点就可以了。   像这样的冗余信息不止这些,但是如果我们换成二叉排序树就不同了。 ☞ 『定义』   个人认为二叉排序树和静态二叉排序树在定义上没有区别。 ☞ 『特点』   用例子来说吧:   比如说现在有这样一组数据:3,6,9,2,5,4,1。   先明确一下位置关系:      假设当前节点为i,那么左子树编号为i×2,右子树编号为i×2+1,所以我们用数组进行存储的时候就是按照这个规律来存储的。  

数据结构:二叉排序树(创建二叉排序树及其中序遍历)

ぐ巨炮叔叔 提交于 2019-11-27 00:44:48
#include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *left, *right; }Node; Node * CreateTree(int n) { int a[101],i; for(i=0;i<n;i++) scanf("%d",&a[i]); Node* t1; t1=(Node*)malloc(sizeof(Node)); t1->data=a[0]; t1->left=t1->right=NULL; for(i=1;i<n;i++) { Node* t2,*p=t1,*q; t2=(Node*)malloc(sizeof(Node)); t2->data=a[i]; t2->left=t2->right=NULL; while(p) { if(p->data>a[i]) { q=p; p=p->left; } else { q=p; p=p->right; } } if(q->data>a[i]) q->left=t2; else q->right=t2; } return t1; } void Preorder(Node *tree) { if(tree==NULL) return ; Preorder(tree->left); printf("%d "

数据--第51课 - 二叉排序树

和自甴很熟 提交于 2019-11-27 00:07:30
第51课 - 二叉排序树 1. 二分查找的回顾 (1)二分查找的特点 二分查找能够提高有序表中数据元素的查找速度。 二分查找的时间复杂度为O(log 2 n)。 二分查找是一种静态查找。 (2)二分查找的不足 当查找表经常变化时,二分查找的整体性能急剧下降。 2. 二分查找的硬伤 二分查找基于有序表。 当需要插入或者删除数据元素时,为了能够继续进行二分查找,需要大规模挪动有序表中的数据元素,使得插入或者删除后的线性表保持有序。 3. 二分查找的过程 二分查找的过程是一棵二叉树! 特点: 任意一个结点的值都大于其左子树的所有结点值。 任意一个结点的值都小于其右子树的所有结点值。 4. 新的想法 直接组织一棵具有二分查找特性的二叉树。二分查找过程即变换为对树结点的查找过程,由二分查找的特性可知树结点查找的时间复杂度为O(log 2 n),只在叶结点处插入新结点即可保持特性不变,删除树结点时也可以容易的保持特性不变 5. 二叉排序树 二叉排序树是一棵空树,或者若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左右子树也分别是二叉排序树。 插入:其插入操作总是在叶结点处进行。 删除:叶结点:直接删除;非叶结点:查找合适的替代者后删除。 如何为删除操作查找合适的替代者? 有一个孩子的结点:用孩子结点代替原结点。

二叉排序树操作(一)

浪尽此生 提交于 2019-11-26 17:42:20
判断给定的二叉树是否是二叉排序树 void JudegBST(BSTree &T){ Queue q; BSTree bst; int flag=1; q.front=-1; q.rear=-1; q.a[++q.rear]=T; while(q.front<q.rear){ bst=q.a[++q.front]; if(bst->lchild){ if(bst->lchild->data<=bst->data){ q.a[++q.rear]=bst->lchild; } else{flag=0;break;} } if(bst->rchild){ if(bst->rchild->data>=bst->data){ q.a[++q.rear]=bst->rchild; } else{flag=0;break;} } } if(flag==0){printf("不是二叉排序树\n");} else{printf("是二叉排序树\n");} } 来源: https://www.cnblogs.com/Yshun/p/11329529.html

二叉排序树实现

风流意气都作罢 提交于 2019-11-26 10:29:30
由{4,9,0,1,8,6,3,5,2,7}创建一个二叉排序树 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 20 #define ElemType int typedef struct BSTNode{ ElemType data; struct BSTNode *lchild,*rchild; }BSTNode,*BSTree; void BSTInsert(BSTree &T,ElemType key){ if(T==NULL){ T=(BSTree)malloc(sizeof(BSTNode)); T->data=key; T->lchild=NULL; T->rchild=NULL; } if(key==T->data){ }//判断树中是否存在相同关键字的节点 if(key<T->data){ BSTInsert(T->lchild,key); } if(key>T->data){ BSTInsert(T->rchild,key); } }//二叉排序树的插入 void CreatBST(BSTree &T,ElemType str[MAXSIZE],int n){ T=NULL; for(int i=0;i<n;i++){ BSTInsert(T,str[i]); } }//创建二叉排序树 void