bst

二叉排序树(Binary Sort Tree)

感情迁移 提交于 2020-03-01 01:23:33
1、定义 二叉排序树(Binary Sort Tree)又称 二叉查找(搜索)树 (Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ① 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; ② 若它的右子树非空,则右子树上所有结点的值均大于根结点的值; ③ 左、右子树本身又各是一棵二叉排序树。 上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。 注意: 当用线性表作为表的组织形式时,可以有三种查找法。其中以二分查找效率最高。但由于二分查找要求表中结点按关键字有序,且不能用链表作存储结构,因此,当表的插入或删除操作频繁时,为维护表的有序性,势必要移动表中很多结点。这种由移动结点引起的额外时间开销,就会抵消二分查找的优点。也就是说,二分查找只适用于静态查找表。若要对动态查找表进行高效率的查找,可采用下二叉树或树作为表的组织形式。不妨将它们统称为树表。 2、特点 由BST性质可得: (1) 二叉排序树中任一结点x,其左(右)子树中任一结点y(若存在)的关键字必小(大)于x的关键字。 (2) 二叉排序树中,各结点关键字是惟一的。 注意: 实际应用中,不能保证被查找的数据集中各元素的关键字互不相同,所以可将二叉排序树定义中BST性质(1)里的"小于"改为"大于等于",或将BST性质(2)里的"大于

Binary Search Tree Iterator——LeetCode

99封情书 提交于 2020-02-25 01:52:04
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST. Calling next() will return the next smallest number in the BST. Note: next() and hasNext() should run in average O(1) time and uses O( h ) memory, where h is the height of the tree. 题目大意:基于一个二叉搜索树实现一个iterator,调用next()返回BST中下一个最小的数。 解题思路:我是在生成这个iterator的时候,预处理这棵树,以后所有的操作都是O(1)。 public class BSTIterator { private Stack<TreeNode> stack = new Stack<>(); public BSTIterator(TreeNode root) { init(root); } private void init(TreeNode node){ if(node==null){ return; } init(node.right);

二叉搜索树(Binary Search Tree)

谁都会走 提交于 2020-02-21 08:07:27
二叉搜索树 (BST, Binary Search Tree ),也称 二叉排序树 或 二叉查找树 。 二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质: 非空 左子树 的 所有键值小于其根结点 的键值; 非空 右子树 的 所有键值大于其根结点 的键值; 左右子树都是二叉搜索树 ; Wiki中的定义 : The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of a node contains only nodes with keys greater than the node's key. The left and right subtrees each must also be a binary search tree. Each node can have up to two successor nodes. There must be no duplicate nodes . A unique path exists from the root to every other node. 二叉搜索树操作的特别函数: Position Find(ElementType X,BinTree BST)

二叉搜索树(BST)

时光毁灭记忆、已成空白 提交于 2020-02-10 22:26:17
二叉搜索树的实现以及相关操作(python) # 树节点数据结构的定义 class TreeNode ( object ) : def __init__ ( self , val ) : self . val = val self . left = None self . right = None # 一些基本的搜索二叉树的操作 class Solution ( object ) : def insert ( self , root , val ) : """ :type root : TreeNode :type x : int :rtype root : TreeNode """ if not root : root = TreeNode ( val ) elif x < root . val : root . left = self . insert ( root . left , val ) else : root . right = self . insert ( root . right , val ) return root def query ( self , root , val ) : """ :type root : TreeNode :type x : int :rtype : bool """ if root == None : return False

二叉搜索树05--第六天

筅森魡賤 提交于 2020-02-09 15:02:21
1.何为二叉搜索树 1.1二叉搜索树的接口设计 1.2添加节点 1.3元素比较方案 1.4相关代码 1.BinarySearchTree类 package com.mj; import java.util.Comparator; import java.util.LinkedList; import java.util.Queue; import com.mj.printer.BinaryTreeInfo; @SuppressWarnings("unchecked") public class BinarySearchTree<E> implements BinaryTreeInfo { private int size; private Node<E> root; private Comparator<E> comparator; public BinarySearchTree() { this(null); } public BinarySearchTree(Comparator<E> comparator) { this.comparator = comparator; } public int size() { return size; } public boolean isEmpty() { return size == 0; } public void clear()

刷题No19. convert-sorted-array-to-binary-search-tree(有序数组转化为二叉搜索树)(java)【数组】

≯℡__Kan透↙ 提交于 2020-02-08 20:33:22
题目: 给出一个升序排序的数组,将其转化为平衡二叉搜索树(BST).示例如下: 给定排序数组:[ -10,-3, 0, 5, 9] 一个可能的答案是:[0,-3, 9,-10,null,5],它代表以下高度平衡的二叉搜索树: 0 / \ -3 9 / / -10 5 补充如下: 一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 二叉搜索树:是一种始终满足左<根<右的特性 本题主要考察的是二分查找算法,把一个有序数组转换成一个二分查找树, 思路:获取中间元素,根节点为中间元素,递归处理数组的其他元素。 代码: package com.company; public class TestNo19 { static class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(int x){ val = x; } } public TreeNode sortedArrayToBST(int[] num) { if(num == null || num.length <1){ return null; } if(num.length == 1){ return new TreeNode(num[0]); } int len = num.length; return toBST(num,0

Leetcode 538. Convert BST to Greater Tree

∥☆過路亽.° 提交于 2020-02-07 19:46:13
要进行转这棵树,仅仅需要进行先遍历右子树,遍历中树,遍历左子树,然后加中间就ok /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int sum = 0; TreeNode* convertBST(TreeNode* root) { if(!root) return NULL; convertBST(root->right); root->val = root->val + sum; sum = root->val; convertBST(root->left); return root; } }; 来源: https://www.cnblogs.com/littlepage/p/12274184.html

938. Range Sum of BST

好久不见. 提交于 2020-02-07 08:53:21
Given the root node of a binary search tree, return the sum of values of all nodes with value between L and R (inclusive). The binary search tree is guaranteed to have unique values. Example 1: Input: root = [10,5,15,3,7,null,18], L = 7, R = 15 Output: 32 Example 2: Input: root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10 Output: 23 1 class Solution { 2 public int rangeSumBST(TreeNode root, int L, int R) { 3 if (root == null) return 0; 4 if (root.val < L) { 5 return rangeSumBST(root.right, L, R); 6 } else if (root.val > R) { 7 return rangeSumBST(root.left, L, R); 8 } else { 9 return root.val

inorder of two BST

北慕城南 提交于 2020-02-07 08:03:49
给两个bst,把它们的值按照从小到大打印。 1 public static void print2BSTInorder(TreeNode n1, TreeNode n2, List<Integer> result) { 2 Stack<TreeNode> stack1 = new Stack<>(); 3 Stack<TreeNode> stack2 = new Stack<>(); 4 5 do { 6 while (n1 != null) { 7 stack1.push(n1); 8 n1 = n1.left; 9 } 10 while (n2 != null) { 11 stack2.push(n2); 12 n2 = n2.left; 13 } 14 if (stack2.isEmpty() || stack1.peek().value < stack2.peek().value) { 15 n1 = stack1.pop(); 16 result.add(n1.value); 17 n1 = n1.right; 18 } else { 19 n2 = stack2.pop(); 20 result.add(n2.value); 21 n2 = n2.right; 22 } 23 } while (!stack1.isEmpty() || n1 != null || n2

BST学习记录

烂漫一生 提交于 2020-02-05 01:08:57
  最近在学BST,打算 发此贴先记录一下学习过程以及例子。 BST特点: 1.右子树大于根节点 2.左子树小于根节点 3.左右节点分别为BST    以下为插入算法的伪代码: f(b,x){ if(b==NULL){ Init b //初始化b,并且使他左右子树都为null b->data=x //将该数据赋值给该节点 } else{ if(x>b->data) f(b->lchild,x) //如果此数据大于该节点,则让他去左子树 else f(b->rchild,x) //否则去右子树 } }    若要从小到大访问,采用中序遍历 以下为伪代码 f(b){ if(b){ f(b->lchild) cout << b->data f(b->rchild) } }    以下为一个例子: 输入学生信息,根据成绩由小到大排名 #include <iostream> #include <fstream> using namespace std; ofstream out("out.txt"); ifstream in("in.txt"); struct student { string name; int id; float score; }; typedef struct BST { student data; BST *lchild, *rchild; } BST; void