二叉搜索树

二叉搜索树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

剑指offer (62)

≯℡__Kan透↙ 提交于 2020-02-08 12:28:09
题目 : 给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。 思路 : 二叉搜索树的中序遍历就是从小到大排序,所以只要找到中序遍历的第K个节点即可;可以使用链表存储节点,要注意边界条件,K可能不是个有效值 import java . util . ArrayList ; import java . util . Arrays ; public class Solution { static TreeNode root = null ; ArrayList < TreeNode > list = new ArrayList < > ( ) ; // 寻找倒数第k小的节点 TreeNode kminNode ( TreeNode root , int k ) { inOrder ( root ) ; if ( k > 0 && list . size ( ) >= k ) { return list . get ( k - 1 ) ; } else return null ; } // 根据中序遍历将数值存进一个链表 public void inOrderLink ( TreeNode root ) { if ( root == null ) { return ; } inOrder ( root .

LeetCode:[98. 验证二叉搜索树] 题解:

为君一笑 提交于 2020-02-08 07:26:09
LeetCode: 98. 验证二叉搜索树 题解: 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输入: 2 / \ 1 3 输出: true 示例 2: 输入: 5 / \ 1 4 / \ 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/validate-binary-search-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 简单分析: 判断是否是二叉搜索树,题目写的很明显,左子树的所有结点都小于根节点,右子树的所有结点都大于根节点 根据上面分析得出:求左子树的最大上界,再求出右子树的最小下界,root的值要在这两个值之间 并不是只要左孩子小于根节点,右孩子大于根节点就好了,这样会存在右子树有小于root的元素,左子树有大于root的元素 中序历遍的结果就是排序树中所有元素排序后的结果。因此只要中序历遍一次,查看序列是否有序即可。 由于满足有序这个特点,我们并不需要全部保存下来

【剑指offer】二叉搜索树的第k个结点

拥有回忆 提交于 2020-02-08 02:21:10
题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点。例如,(5,3,7,2,4,6,8)中,按结点数值大小顺序第三小结点的值为4。 解题思路 首先,二叉搜索树有一个很好的特性,任意一个结点必大于其左子树的所有结点,必小于等于其右子树的所有结点。如果使用中序遍历二叉搜索树,那么结果会按数值从小到大的顺序输出。 <图> 例如上图就是一棵二叉搜索树。中序遍历上图的二叉搜索树,输出结果为:1,3,4,6,7,8,10,13,14。 所以自然地我们就产生了一个解决方法,就是使用中序遍历二叉搜索树,记录输出个数,如果输出个数等于目标 k,则返回该结点即可。 这里使用非递归的方法实现中序遍历,以便记录输出个数。使用栈来存储结点,先扫描根结点的所有左结点,并将它们放进栈,直至左结点为空,然后取出栈顶结点,访问栈顶结点,再扫描该结点的右结点,将其进栈,再扫描这个右结点的所有左结点并进栈,如此继续,直到栈空。 (PS:博客 《二叉树的中序遍历非递归算法》 中用图展示了中序遍历的非递归算法,比较直观。另一篇 博客 则展示了二叉树的三种遍历方法递归及非递归的实现代码。) 实现代码: /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left

验证二叉搜索树

此生再无相见时 提交于 2020-02-07 07:54:04
题目 思路 自己的思路 错误思路 首先我们先分析一下题目, 二叉搜索树就是左子树所有的节点都比根节点的关键值小,右子树所有节点的关键值都比根节点关键值大 ,一开始自己的思路就是利用递归,比较左子树根节点的关键值和根节点的关键值,和比较右子树根节点的关键值和根节点的关键值,然后再分别递归的判断左子树和右子树。相关代码如下: bool isValidBST(TreeNode* root) { //下式只能判断出任意节点的左子树根节点都小于该节点,右子树的根节点都大于该节点,并不能得出其就是二叉搜索树 if (root == NULL) { return true; } TreeNode* T = root; bool left=true, right=true; if ((!T->left && T->val < T->left->val) || (!T->right && T->right->val < T->val)) return false; left = isValidBST(T->left); right = isValidBST(T->right); return left*right; } 上述思路不能判断一棵二叉树是否就是二叉搜索树,因为不能保证满足条件 左子树所有节点的关键值都小于根节点关键值,右子树所有节点关键值都大于根节点关键值

Leetcode 验证二叉搜索树

倖福魔咒の 提交于 2020-02-07 07:08:41
给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输入: 2 / \ 1 3 输出: true 示例 2: 输入: 5 / \ 1 4 / \ 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。这道题我想的解答方案是错误的,后来参考了别人的 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def isValidBST(self, root): """ :type root: TreeNode :rtype: bool """ def test(root): l=[] if not root: return [] l+=test(root.left) # 类似于中序遍历 l.append(root.val) l+=test(root.right) return l res=test

是否二叉搜索树

冷暖自知 提交于 2020-02-07 07:08:23
6-1 是否二叉搜索树 (25 分) 本题要求实现函数,判断给定二叉树是否二叉搜索树。 函数接口定义: 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

【LeetCode】验证二叉搜索树

江枫思渺然 提交于 2020-02-07 07:05:44
【问题】给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输入: 2 / \ 1 3 输出: true 示例 2: 输入: 5 / \ 1 4 / \ 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。 【思路】如何判断一棵二叉树是否为BST,很简单的思路就是:对这棵二叉树进行中序遍历,然后判断其中序遍历后的序列是不是单调递增的序列,如果是,则为一棵BST,否则不是。 但是二叉树的中序遍历有两个版本,递归版和非递归版本,我们先来看递归版本,其实际就是一个dfs算法,从根节点依次向下深入,在递归体内我们需要 设置两个变量min, max来进行数值边界的判断,以使得遍历后的序列为一个单调增序列! /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */

C++二叉搜索树与双向链表(剑指Offer精简版)

戏子无情 提交于 2020-02-07 00:52:20
题目:输入一棵二叉搜索树,将该二叉搜素树转换成一个排序的双向链表。 二叉树节点定义如下: struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; 解题思路: 由于通过中序排序可以转化为双向链表,因此,通过中序遍历的方法(左根右)的递归方法可以解决问题,解决完之后,pList节点指向双向链表的尾结点,pList节点需要通过遍历,返回到头节点,同样,我们也可以通过逆向中序遍历的方法之间完成,代码如下: class Solution { public: TreeNode* Convert(TreeNode* pRootOfTree) { TreeNode* pList=nullptr;//双向链表的头节点 Convert(pRootOfTree,pList); return pList; } void Convert(TreeNode* pRootOfTree,TreeNode*& pList) { if(pRootOfTree==nullptr)//递归的出口 return; if(pRootOfTree->right!=nullptr)//递归处理右子树 Convert