二叉搜索树

二叉搜索树

允我心安 提交于 2019-12-05 05:27:06
一、二叉搜索树的特点 二叉搜索树的特点:对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。 根据这个性质, 对一个二叉树进行中序遍历,如果是单调递增的,则可以说明这个树是二叉搜索树 。 LeetCode题目98:验证二叉搜索树( https://leetcode-cn.com/problems/validate-binary-search-tree/ )就可以对这个二叉树进行中序遍历,然后判断是否单调递增的,如果是单调递增的,说明是二叉搜索树。否则不是二叉搜索树。 二、二叉搜索树的查找 过程:首先和根节点进行比较,如果等于根节点,则返回。如果小于根节点,则在根节点的左子树进行查找。如果大于根节点,则在根节点的右子树进行查找。 1 /* 查找以t为根节点的树中,是否包含x */ 2 Position Find(ElementType x, SearchTree t) 3 { 4 if (t == NULL) { 5 return NULL; 6 } else if (x < t->element) { 7 return Find(x, t->left); 8 } else if (x > t->element) { 9 return Find(x, t->right); 10 } else { 11 return t; 12

二叉搜索树BST

心已入冬 提交于 2019-12-04 21:20:03
数据域大小关系:   根>左,根<右 假设所有二叉树的所有结点数据都是正数,且两两不同 arr 6,3,8,2,5,1,7 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct node{ 5 int data; 6 struct node* left; 7 struct node* right; 8 } Node; 9 10 typedef struct{ 11 Node* root; 12 } Tree; 13 14 void insert(Tree* tree, int value) 15 { 16 Node* node= malloc(sizeof(Node)); 17 node -> data = value; 18 node -> left = NULL; 19 node -> right = NULL; 20 21 if(tree -> root == NULL){ 22 tree -> root = node; 23 return ; 24 } 25 else 26 { 27 Node* temp = tree -> root; 28 while(temp != NULL){ 29 if(temp -> data > value){ 30 //走左边有两种情况 31 if(temp -> left

二叉搜索树BST(C语言实现可用)

徘徊边缘 提交于 2019-12-04 16:26:41
1:概述 搜索树是一种可以进行插入,搜索,删除等操作的数据结构,可以用作字典或优先级队列。二叉搜索树是最简单的搜索树。其左子树的键值<=根节点的键值,右子树的键值>=根节点的键值。 如果共有n个元素,那么每次操作需要的O(log n)的时间. 常用知识点 满二叉树 : 一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。 完全二叉树 : 而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层要么是满的,要么在右边缺少连续若干节点,则此二叉树为完全二叉树。具有n个节点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至少有2^(k-1)个叶子节点,至多有2^k-1个节点。 2.基本操作 查找(search) 插入(insert) 删除(remove) 3:操作原理    查找 假设查找的值为x,从根节点的值开始比对,如果小于根节点的值,则往左儿子继续查找,如果大于根节点的值,则往右儿子继续查找.依次类推.直到当前节点的值等于要查找的值.   以查找数值10为例 插入 按照查找的步骤即可找到插入值应该在的位置 以插入数值6为例 删除: 有四种情况: 1: // 当前节点无左节点 ,右字节点7覆盖5, : 3: // 当前节点无右节点 ,右字节点7覆盖5, : 4: // 删除节点5的左节点没有右节点,

习题4.3 是否二叉搜索树 (25 分) 浙大版《数据结构(第2版)》题目集

。_饼干妹妹 提交于 2019-12-04 16:07:51
本题要求实现函数,判断给定二叉树是否二叉搜索树。 函数接口定义: bool IsBST ( BinTree T ); 其中 BinTree 结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; 函数 IsBST 须判断给定的 T 是否二叉搜索树,即满足如下定义的二叉树: 定义:一个二叉搜索树是一棵二叉树,它可以为空。如果不为空,它将满足以下性质: 非空左子树的所有键值小于其根结点的键值。 非空右子树的所有键值大于其根结点的键值。 左、右子树都是二叉搜索树。 如果 T 是二叉搜索树,则函数返回true,否则返回false。 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> typedef enum { false, true } bool; typedef int ElementType; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; };

LeetCode 98. 验证二叉搜索树

荒凉一梦 提交于 2019-12-04 15:58:47
题目链接: 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 思路:中序递归遍历二叉树。。。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 long minnum=LONG_MIN; 13 bool flag=true; 14 bool isValidBST(TreeNode* root) { 15 if(root==NULL) return true; 16 if(flag&&root->left) isValidBST(root->left); 17 if(root->val<=minnum) flag=false; 18 minnum=root->val; 19 if(flag&&root->right) isValidBST

二叉搜索树的第 K 个节点

独自空忆成欢 提交于 2019-12-04 14:00:57
利用二叉查找树中序遍历有序的特点。 private TreeNode ret; private int cnt = 0; public TreeNode KthNode(TreeNode pRoot, int k) { inOrder(pRoot, k); return ret; } private void inOrder(TreeNode root, int k) { if (root == null || cnt >= k) return; inOrder(root.left, k); cnt++; if (cnt == k) ret = root; inOrder(root.right, k); } public class Solution { int index = 0; //计数器 TreeNode KthNode(TreeNode root, int k) { if(root != null){ //中序遍历寻找第k个 TreeNode node = KthNode(root.left,k); if(node != null) return node; index ++; if(index == k) return root; node = KthNode(root.right,k); if(node != null) return node; } return

[LeetCode]96. 不同的二叉搜索树(DP,卡特兰数)

耗尽温柔 提交于 2019-12-04 06:36:10
题目 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/unique-binary-search-trees 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 题解 指定节点个数的BST的种类是固定的,可以容易想到递归:左子树*右子树 且每个节点轮流做根结点 即得到所有可能。使用DP来做。 以三个节点为例,用dp[3]表示 dp[3]=dp[0] dp[2]+dp[1] dp[1]+dp[2]*dp[0] 故转移方程: dp[n]+=dp[i]*dp[n-i-1] (i=0,1,...n-1) 其他 卡特兰数是组合数学中一个常出现在各种计数问题中出现的数列。 本题的dp数组即是卡特兰数 代码 class Solution { public int numTrees(int n) { if (n <= 0) { return 0; } if (n == 1) { return 1; } int[] dp = new int[n + 1];

230. 二叉搜索树中第K小的元素

放肆的年华 提交于 2019-12-04 06:32:58
题目: 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。 示例 1: 输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2 输出: 1 示例 2: 输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1 输出: 3 进阶: 如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值, 你将如何优化 kthSmallest 函数? 提示1: Try to utilize the property of a BST. 提示2: Try in-order traversal.( Credits to @chan13) 提示3: What if you could modify the BST node s structure? 提示4: The optimal runtime complexity is O(height of BST). /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode

leetcode 99:恢复二叉搜索树

一曲冷凌霜 提交于 2019-12-04 02:36:59
方法一:首先使用中序遍历将所有的节点和节点的值存起来,如果是搜索二叉树节点值的数组应该是升序的,找到不是升序的点,交换节点的值,空间复杂度为O(n) void inorder(TreeNode*root,std::vector<TreeNode*>&list,std::vector<int> &vals){ if(root==NULL) return; inorder(root->left,list,vals); list.push_back(root); vals.push_back(root->val); inorder(root->right,list,vals); } void recoverTree(TreeNode*root){ std::vector<TreeNode*>list; std::vector<int>vals; inorder(root,list,vals); std::vector<int> node; for(int i=0;i<vals.size()-1;){ if(vals[i]>vals[i+1]) { node.push_back(i); i=i+2; if(node.size()==2) break; }else i=i+1; } if(node.size()==1) { int c=node.back(); node.clear();

LeetCode_99. 恢复二叉搜索树

ぃ、小莉子 提交于 2019-12-04 02:32:51
题目描述: 二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下,恢复这棵树。 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ 2 输出: [3,1,null,null,2] 3 / 1 \ 2 示例 2: 输入: [3,1,4,null,null,2] 3 / \ 1 4 / 2 输出: [2,1,4,null,null,3] 2 / \ 1 4 / 3 思想:按照中序遍历二叉树,查找两个违反由小到大的节点。 1、定义两个空指针p、q,p指向第一个错误节点,q指向第二个错误节点 2、第一个错误节点p指向前一个节点,第二个错误的节点指向后一个节点 /** * 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: TreeNode *pre=NULL,*p=NULL,*q=NULL; void inorder(TreeNode* &root,TreeNode* &pre,TreeNode* &p,TreeNode* &q){