二叉搜索树

62.二叉搜索树的第k个结点

耗尽温柔 提交于 2020-02-14 23:26:05
题目 给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。 思路 二叉搜索树的中序遍历是升序的,要找到第k个结点,就中序遍历到第k个结点就行了。 代码 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { int cnt ; TreeNode * res ; public : TreeNode * KthNode ( TreeNode * pRoot , int k ) { cnt = 0 ; res = nullptr ; helper ( pRoot , k ) ; return res ; } void helper ( TreeNode * node , int & k ) { if ( node == nullptr ) return ; helper ( node - > left , k ) ; cnt + = 1 ; if ( cnt == k ) { res = node ; return ; } helper ( node - >

Java--数据结构之二叉搜索树

空扰寡人 提交于 2020-02-14 16:22:11
一、二叉搜索树Binary Search Tree 1、若左子树不为空,则左子树上所有节点的值均小于或等于它的根节点的值。 2、若右子树不为空,则右子树上所有节点的值均大于或等于它的根节点的值。 3、左、右子树也分别为二叉搜索树。 二、节点域设置 //根节点 private Entry < T > root ; //初始化 public BSTDemo ( ) { this . root = null ; } //节点域 public class Entry < T extends Comparable < T > > { private T data ; //数据域 private Entry < T > left ; //左孩子域 private Entry < T > right ; //右孩子域 public Entry ( ) { this ( null , null , null ) ; } public Entry ( T data , Entry < T > left , Entry < T > right ) { this . data = data ; this . left = left ; this . right = right ; } } 三、递归和非递归操作BST 1、插入 (1)递归插入 //插入 public void insert ( T val

LeetCode235 二叉搜索树的最近公共祖先

北战南征 提交于 2020-02-13 22:26:49
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科 中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] _______6______ / \ ___2__ ___8__ / \ / \ 0 _4 7 9 / \ 3 5 示例 1: 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 输出: 6 解释: 节点 2 和节点 8 的最近公共祖先是 6。 示例 2: 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 输出: 2 解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。 说明: 所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉搜索树中。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *

46二叉搜索树的第k个结点

孤街醉人 提交于 2020-02-13 12:12:25
题目 46二叉搜索树的第k个结点 ‘’’ 题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。 ‘’’ 分析 二叉搜索树 定义 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 特点 采用中序遍历的方式遍历二叉树,其是从小到大排序的 该题图示 中序遍历的结果 2,3,4,5,6,7,8 实现 # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution : # 返回对应节点TreeNode def KthNode ( self , pRoot , k ) : # write code here if pRoot == None or k < 1 : return None midList = [ ] def midOrder ( root ) : if

leetcode98 验证二叉搜索树

我怕爱的太早我们不能终老 提交于 2020-02-12 20:05:17
题目 : https://leetcode-cn.com/problems/validate-binary-search-tree/ 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 思路 : 中序遍历这个二叉树,判断遍历结果是否是递增的,如果递增说明是一个BST class Solution { public: void inorder(TreeNode* root, vector<int>& ans){ if(root == nullptr) return; inorder(root->left, ans); ans.push_back(root->val); inorder(root->right, ans); } bool isValidBST(TreeNode* root) { vector<int> traversal; inorder(root, traversal); for(int i = 1; i < traversal.size(); ++i){ if(traversal[i-1] >= traversal[i]) return false; } return true; } }; 递归的方法做

关于二叉搜索树

情到浓时终转凉″ 提交于 2020-02-12 15:11:58
二叉搜索树的定义是,根节点的左子树的每一个节点都比它小,右子树的每一个节点都比它大。有个题目是输入一个二叉搜索树,要求把它转换成一个排序的双向链表。我用C++来写,稍后补上代码。这里先要记住定义。因为题目要求不创建新的节点,直接调整树的指针。我先把这个树节点的结构放这里一下。 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; 看过我之前博客的同学应该知道,C++ Primer里讲了,struct和class的区别。struct默认对象是public的,然后class默认是private的。如果想要成员都是public的情况,我们用struct。好的就先到这里。 来源: CSDN 作者: 钱德勒马 链接: https://blog.csdn.net/u013516861/article/details/104277467

二叉搜索树07--第七天

*爱你&永不变心* 提交于 2020-02-11 13:24:44
1.重构二叉树 1.1前序遍历+中序遍历重构二叉树 1.2练习--利用前序遍历树桩打印二叉树 1.3练习翻转二叉树 1.4练习--计算二叉树的高度 1.5练习--判断一棵树是否为完全二叉树 1.5前驱节点 1.6后继节点 1.7作业 来源: https://www.cnblogs.com/ggnbnb/p/12294632.html

leetcode95 不同的二叉搜索树II

落爺英雄遲暮 提交于 2020-02-10 23:27:33
题目 : https://leetcode-cn.com/problems/unique-binary-search-trees-ii/ 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。 思路 :还是要从递归的角度去思考,策略是,从1-n中选择i作为根节点,那么1-i-1作为它的左子树,i+1-n作为它的右子树,1-i-1生成的BST的个数乘以i+1-n生成的BST的个数就是以i为根节点得到的BST的个数。 这里的递归调用如图: 代码 : class Solution { public: vector<TreeNode*> dfs(int l, int r){ vector<TreeNode*> res; if(l > r){ res.push_back(nullptr); return res; } for(int i = l; i <= r; ++i){ vector<TreeNode*> left = dfs(l, i-1); vector<TreeNode*> right = dfs(i+1, r); for(auto &l:left){ for(auto &r:right){ TreeNode* root = new TreeNode(i); root->left = l; root->right = r; res.push_back(root);

二叉搜索树06-第六天

半世苍凉 提交于 2020-02-10 20:42:58
1.一些树的动画演示网站 http://520it.com/binarytrees/ http://btv.melezinek.cz/binary-search-tree.html https://www.cs.usfca.edu/~galles/visualization/Algorithms.html https://yangez.github.io/btree-js/ https://www.codelike.in/ 2.二叉树的遍历 2.1前序遍历 2.2前序非递归遍历 2.3中序遍历 2.5后序遍历 2.6层次遍历 3.相关代码总结 3.1前序遍历 // /** // * 前序遍历 // */ public void preorderTraversal() { preorderTraversal(root); } private void preorderTraversal(Node<E> node) { if (node == null) return; System.out.println(node.element); preorderTraversal(node.left); preorderTraversal(node.right); } View Code 3.2中序遍历 // /** // * 中序遍历 // */ public void

LeetCode235-二叉搜索树的最近公共祖先

点点圈 提交于 2020-02-10 04:58:47
根据236的做法,这个就简单了。 递归主要费时间的地方是,分别去左右子树去找,有没有p和q。 利用搜索树的性质,减少递归的次数 如果p和q都小于root,去左边找就行。 如果p和q在两侧的,直接就是root,这个可以通过val来判断。 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { //返回条件一样 //如果往下的过程中,先遇到p或者q,它就是最近祖先 if(root==null||root==p||root==q) return root; //都在左边,那p和q都在左子树下,返回左子树递归的结果就好 if (p.val<root.val&&q.val<root.val){ return lowestCommonAncestor(root.left,p,q); }else if(p.val>root.val&&q.val>root.val){ return lowestCommonAncestor(root.right,p,q); }else { //val一个大于一个小于,直接就是自己的 return root; } } 来源: https://www.cnblogs.com/weizhibin1996/p/9695118.html