二叉搜索树

《剑指offer》树专题 (牛客10.25)

╄→尐↘猪︶ㄣ 提交于 2019-12-02 11:40:54
考察的知识点主要在于树的数据结构(BST,AVL)、遍历方式(前序,中序,后序,层次)、遍历算法(DFS,BFS,回溯)以及遍历时借助的数据结构如队列和栈。由于树本身就是一个递归定义的结构,所以在递归求解问题时,要善于将问题转化成合适的子问题,思考清楚子问题的形式、递归的出口、父问题与子问题的联系。 以下这些问题难度都不太大,很多都是一次过,比上次链表专题的思维难度小多了。 难度 题目 知识点 04. 重建二叉树 依据前序和中序遍历重建 , 递归 ★★ 17. 树的子结构 递归 18. 二叉树的镜像 简单递归 22. 从上往下打印二叉树 bfs , Queue的使用 23. 判断是否为二叉搜索树的后序遍历序列 BST , 递归 ★ 24. 二叉树中和为某一值的路径 dfs , 回溯 , Collections.sort() ★★ 26. 二叉搜索树与双向链表 递归 中序遍历 ★ 38. 二叉树的深度 递归 39. 平衡二叉树 平衡二叉树 递归 57. 二叉树的下一个结点 中序遍历 循环 回溯后的情况 58. 对称的二叉树 递归 可转化为非递归 59. 按之字形顺序打印二叉树 Stack 层次遍历变形 60. 把二叉树打印成多行 Queue LinkedList 层次遍历 ★★ 61. 序列化二叉树 递归 string.split() string.equals 62.

平衡二叉搜索树AVL

佐手、 提交于 2019-12-02 02:47:25
package com.sunshine.AlgorithmTemplate; import com.sunshine.OFFER66_SECOND.BalanceTreeNode; import com.sunshine.OFFER66_SECOND.TreeUtility; import org.junit.Test; public class BalanceTreeTemplate { @Test public void test() { insert(5); insert(2); insert(3); insert(4); insert(1); insert(6); insert(7); insert(0); insert(8); delete(5); delete(6); delete(3); } public void insert(int num) { root = insert(root, num); TreeUtility.printTreeOfLine(root); System.out.println("=========="); } public void delete(int num) { root = deleteNode(root, num); TreeUtility.printTreeOfLine(root); System.out.println(

数据结构与算法——平衡二叉树

旧城冷巷雨未停 提交于 2019-12-01 21:34:38
1 引言 2 二叉搜索树 2.1 定义 2.2 性质 2.3 节点结构 2.4 创建二叉搜索树 2.5 查找 2.6 插入 2.7 删除 3 平衡二叉树 3.1 定义 3.2 平衡因子 3.3 节点结构 3.4 左旋与右旋 3.5 插入 1 引言   二叉树是数据结构中的重点与难点,也是应用较为广泛的一类数据结构。二叉树的基础知识在之前的数据结构与算法——二叉树基础中已经详细介绍。本篇文章将着重介绍两类二叉树,二叉搜索树和平衡二叉树。 2 二叉搜索树 2.1 定义   二叉搜索树又称二叉查找树,亦称为二叉排序树。设x为二叉查找树中的一个节点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个节点,则key[y] <= key[x];如果y是x的右子树的一个节点,则key[y] >= key[x]。 2.2 性质   (1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值;   (2)若右子树不空,则右子树上所有节点的值均大于它的根节点的值;   (3)左、右子树也分别为二叉搜索树;   例如:图2.2.1所示的二叉树为一棵二叉搜索树。 图2.2.1   例如:图2.2.2所示不是一棵二叉搜索树,因为节点40的左孩子节点值为44,不满足二叉搜索树的定义。 图2.2.2 2.3 节点结构   二叉树的节点结构通常包含三部分,其中有:左孩子的指针

04-树7 二叉搜索树的操作集 (30 分)

一笑奈何 提交于 2019-12-01 10:23:50
本题要求实现给定二叉搜索树的5种常用操作。 函数接口定义: BinTree Insert( BinTree BST, ElementType X ); BinTree Delete( BinTree BST, ElementType X ); Position Find( BinTree BST, ElementType X ); Position FindMin( BinTree BST ); Position FindMax( BinTree BST ); 其中 BinTree 结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; 函数 Insert 将 X 插入二叉搜索树 BST 并返回结果树的根结点指针; 函数 Delete 将 X 从二叉搜索树 BST 中删除,并返回结果树的根结点指针;如果 X 不在树中,则打印一行 Not Found 并返回原树的根结点指针; 函数 Find 在二叉搜索树 BST 中找到 X ,返回该结点的指针;如果找不到则返回空指针; 函数 FindMin 返回二叉搜索树 BST 中最小元结点的指针; 函数 FindMax 返回二叉搜索树 BST

LeetCode 95. 不同的二叉搜索树 II

妖精的绣舞 提交于 2019-11-30 13:33:28
题意:给出n,求出1~n所构造的BST集合。 (由于返回值是vector<TreeNode*>,我刚开始还没看懂这是什么意思.....) 解题思路: 对于一棵BST,很显然,其左右子树都是BST。 因为要构造所有BST,因此每个结点都可能是根结点。 那么建立一个函数BuildTree(int left,int right), 建立包括[left,right)的所有BST,在函数内,需要for来选取每个结点作为根结点。 接下来就是容易出问题的地方。 刚开始我是这样定义: TreeNode* BuildTree(int left,int right); 然后在内部, root->left=BuildTree(left,i); root->right=BuildTree(i+1,right); 结果在运行的时候发现怎么少了一些树。 问题根源:在这样的BuildTree中,对于每个root,只会返回一棵子树。(即使你循环了n次,只在最后一次进行返回,因此只返回一棵子树)。 纠正:vector<TreeNode*> BuildTree(int left,int right),返回包含[left,right)的所有BST!!! 另外,LeetCode还是能够cout进行调试,系统会在下面显示标准输出!!!(下次关于LeetCode的调试还是做一篇总结,不会调试还是挺麻烦的。) 1 /** 2

Java--二叉搜索树转换为排序双向链表

∥☆過路亽.° 提交于 2019-11-30 09:35:41
二叉搜索树是一种特殊的二叉树,左子树的所有结点小于根节点,右子树的所有结点大于根节点。 此题使用中序遍历即可得到有序序列 把相邻的元素互相指向,left指向前一个元素,right指向后一个元素 1.判定特殊情况,如果为空,则返回null 2.递归把左子树变成双向链表,并返回这个链表的第一个结点 3.如果左侧链表的头结点不为空,当前左侧链表的尾巴找到,让左侧链表的尾结点和当前root结点相互指向 4.递归将右子树转换成双向链表 5.把右侧链表的头节点和当前结点相互指向 public TreeNode Convert(TreeNode pRootOfTree){ if(pRootOfTree == null){ return null; } if(pRootOfTree.left == null && pRootOfTree.right == null){ return pRootOfTree; } TreeNode left = Convert(pRootOfTree.left); TreeNode leftTail = left; while(pRootOfTree.left != null && leftTail.right != null){ leftTail = leftTail.right; } if(left != null){ leftTail.right =

二叉搜索树与双向链表

谁说我不能喝 提交于 2019-11-30 03:20:33
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 /////////////////////////////////////////////////////////////// 下午有点晕晕的,感觉不太好,改了改也算是过了, 中序遍历,一开始不知道如何判断是该返回root左边的还是右边的节点,所以加了一个flag判断一下, 如果flag=1,说明对于上一层节点,这是左子树,那么返回root最右边的节点, 如果flag=2,说明对于上一层,这是右子树,那么返回root最左边的节点, flag=0,说明到了根节点那里,返回最左边的节点就是链表最开始的节点了。 ****************************************************************************************** 后来我看了解答,发现好像返回谁都行,因为你返回以后,上一层的root节点接收你返回的节点,如果这是左子树返回的,那么找到最后就是要连接的节点了 如果是右子树返回的,那么找到最左边的那个,就是root后面要跟着的节点了。 //还有一些细节比如为空之类的就不提了 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode

二叉搜索树的后序遍历判断

帅比萌擦擦* 提交于 2019-11-30 01:49:31
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 之前对于二叉搜索树,只知道中序遍历是递增的,今天做到这道题目,要求判断数组是不是二叉搜索树后序遍历的结果,一开始有点懵,后来在纸上画画,感觉很像递归的感觉,有一种特别像归并排序的那种感觉一样,然后发现对于每一个树的子结构而言,我们将其分成左右子树两部分就可以很明白这种递归的结构了,分成两部分,然后分别对左右在递归,直到叶子节点 1 public class Solution { 2 public boolean VerifySquenceOfBST(int [] sequence) { 3 if(sequence.length==0) 4 return false; 5 return helper(sequence,0,sequence.length-1); 6 } 7 public boolean helper(int[] arr, int l,int r) 8 { 9 if(l>=r) 10 return true; 11 for(int i=l;i<r;i++) 12 { 13 if(arr[i]>arr[r]) 14 { 15 for(int j=i;j<r;j++) 16 if(arr[j]<arr[r]) 17

javascript实现二叉搜索树

≡放荡痞女 提交于 2019-11-30 01:38:36
在使用javascript实现基本的数据结构中,练习了好几周,对基本的数据结构如 栈、队列、链表、集合、哈希表、树、图等内容进行了总结并且写了笔记和代码。 在 github中可以看到 点击查看 ,可以关注一下我哈。 树的基本术语 二叉树节点的存储结构 创建一个二叉搜索树 二叉树的先序、中序、后续遍历算法 二叉树的非递归先序、中序、后续遍历算法 。 文章对树了解的不多的人有点不友好,这里简单介绍(从书上抄下来)那些基本的一点概念吧。 看下面这个示意图 树的基本术语: 结点: A、B、C等都是结点,结点不仅包含数据元素,而且包含指向子树的分支。例如,A结点不仅包含数据元素A、还包含3个指向子树的指针。 结点的度: 结点拥有的子树个数或者分支的个数,例如A结点有3棵子树,所以A结点的度为3. 树的度: 树中各结点度的最大值。如例子中结点度最大为3(A、D结点)。最小为0(F、G、I、J、K、L、M),所以树的度为3。 叶子节点 :又叫做 终端节点, 指度为0的节点,F、G、I、J、K、L、M节点都是叶子节点。 孩子: 结点的子树的根,如A节点的孩子为B、C、D。 双亲: 与孩子的定义对应,如B C D结点的双亲都是A。 兄弟: 同一个双亲的孩子之间互为兄弟。如B、C、D互为兄弟,因为它们都是A节点的孩子。 祖先 :从根到某节点的路径上的所有结点,都是这个节点的祖先。如K的祖先是A B E

Leetcode 95.不同的二叉搜索树II

↘锁芯ラ 提交于 2019-11-29 23:22:09
不同的二叉搜索树2 给定一个整数 n ,生成所有由 1 ... n 为节点所组成的 二叉搜索树 。 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树: 1 /** 2 * Definition for binary tree 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 vector<TreeNode *> generateTrees( int n) { 13 vector<TreeNode *> ret; 14 if (n == 0 ) 15 return ret; 16 return Helper(1 , n); 17 } 18 vector<TreeNode *> Helper( int begin, int end) 19 { 20 vector<TreeNode *> ret;