二叉树-二叉搜索树(中序)

题型:

(1)验证

(2)修复(排列不正确,修复)

(3)构造(给排列求树-平衡的;种类)

(4)利用性质求第n个结点

二叉搜索树的思路:中序输出+相关操作

如果要求空间复杂度O(1),考虑莫里斯遍历

98. 验证二叉搜索树    面试题 04.05. 合法二叉搜索树 (1)

思路:中序排列,看次序

 1 class Solution {
 2     public boolean isValidBST(TreeNode root) {
 3         // if(root==null){  // 题目空树是true
 4         //     return false;
 5         // }
 6         List<Integer> list = new ArrayList<>();
 7         inorder(root, list);
 8         for(int i=0;i<list.size()-1;i++){
 9             if(list.get(i)>=list.get(i+1)){  // 有相同元素不行,不同题目要求不同。
10                 return false;
11             }
12         }
13         return true;
14     }
15     public void inorder(TreeNode node, List<Integer> list){
16         if(node==null){
17             return;
18         }
19         inorder(node.left, list);
20         list.add(node.val);
21         inorder(node.right, list);
22         return;
23     }
24 }

99. 恢复二叉搜索树 ?? (2)

思路:中序排列,出现前结点比后结点大的情况,把这两个结点存储,最后交换这些结点的值。画一画

(1)只有一次逆序(相邻结点交换错误):直接交换相邻的两个结点的val

(2)有两次逆序(非相邻结点交换错误):交换第一次逆序的大值,和第二次逆序的小值。

引申:O(1)空间?

 1 class Solution {
 2     public void recoverTree(TreeNode root) {
 3         if(root==null){
 4             return;
 5         }
 6         List<TreeNode> nodeList = new ArrayList<>();
 7         inorder(root, nodeList);
 8         int left = -1;
 9         int right = -1;
10         for(int i = 0;i<nodeList.size()-1;i++){
11             if(nodeList.get(i).val > nodeList.get(i+1).val){
12                if(left==-1){
13                    left=i;
14                }else{
15                    right=i+1;
16                }
17             }
18         }
19         if(right==-1){
20             int temp = nodeList.get(left).val;
21             nodeList.get(left).val=nodeList.get(left+1).val;
22             nodeList.get(left+1).val=temp;
23         }else{
24             int temp = nodeList.get(left).val;
25             nodeList.get(left).val=nodeList.get(right).val;
26             nodeList.get(right).val=temp;
27         }
28
29     }
30     public void inorder(TreeNode node , List<TreeNode> nodeList){
31         if(node==null){
32             return;
33         }
34         inorder(node.left, nodeList);
35         nodeList.add(node);
36         inorder(node.right, nodeList);
37     }
38 }

108. 将有序数组转换为二叉搜索树 (3)

思路:二分法

 1 class Solution {
 2     public TreeNode sortedArrayToBST(int[] nums) {
 3         if(nums == null || nums.length==0){
 4             return null;
 5         }
 6         return buildTree(nums, 0, nums.length-1); // 小心数组越界
 7     }
 8     public TreeNode buildTree(int[] nums, int left, int right){
 9         if(left>right){
10             return null;
11         }
12         int mid=(left+right)/2;
13         TreeNode root = new TreeNode(nums[mid]);
14         root.left = buildTree(nums, left, mid-1);
15         root.right = buildTree(nums, mid+1, right);
16         return root;
17     }
18 }

96. 不同的二叉搜索树

思路:动态规划

 1 class Solution {
 2     public int numTrees(int n) {
 3         int[] sum = new int[n+1];
 4         sum[0]=1;
 5         for(int k=1;k<=n;k++){  // 迭代计算sum[1]=>sum[n]
 6             for(int i=1;i<=k;i++){ // 分别以1->n 作为头结点计算种类
 7                 sum[k]+=sum[i-1]*sum[k-i]; //i为根,左边i-1个结点,右边k-i个结点
 8             }
 9         }
10         return sum[n];
11     }
12 }

95. 不同的二叉搜索树 II

109. 有序链表转换二叉搜索树

501. 二叉搜索树中的众数

引申:O(1)空间?

原文地址:https://www.cnblogs.com/naonaoling/p/12364848.html

时间: 2024-07-30 07:57:10

二叉树-二叉搜索树(中序)的相关文章

1099 Build A Binary Search Tree [二叉搜索树/中序、层次遍历]

先用中序确定节点的值,再用层次遍历输出即可. 写的时候思维江化,一开始用指针建树... #include <bits/stdc++.h> using namespace std; #define maxn 105 struct Node { int index,left,right; }node[maxn]; int n,a[maxn],tree[maxn]; vector<int> ve[maxn],in,post; void inorder(int p) { if(node[p

纸上谈兵: 树, 二叉树, 二叉搜索树

树的特征和定义 树(Tree)是元素的集合.我们先以比较直观的方式介绍树.下面的数据结构是一个树: 树有多个节点(node),用以储存元素.某些节点之间存在一定的关系,用连线表示,连线称为边(edge).边的上端节点称为父节点,下端称为子节点.树像是一个不断分叉的树根. 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent).比如说,3,5是6的子节点,6是3,5的父节点:1,8,7是3的子节点, 3是1,8,7的父节点.树有一个没有父节点的节点,称为根节点(

二叉树--二叉搜索树

一直对AVL这个英文缩写比较困惑,原来一直以为是平衡二叉树的首字母缩写,但是又想不明白,哈!前段时间才明白原来是种这课树的三个人的名字的首字母的,哎,生活处处有惊喜,无知不可怕,现在我也知道了.废话不多说,下面我们说说,树形结构中的那些平衡二叉树. 二叉排序树 树的遍历顺序有3种,二叉排序树,顾名思义,就是一颗有序的二叉树,是一种按照中序遍历树中节点,而输出有序队列的一种树形结构,一种特殊的树形结构. 定义 对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的key值记为

树, 二叉树, 二叉搜索树

转载:Vamei   出处:http://www.cnblogs.com/vamei 树的特征和定义 树(Tree)是元素的集合.我们先以比较直观的方式介绍树.下面的数据结构是一个树: 树有多个节点(node),用以储存元素.某些节点之间存在一定的关系,用连线表示,连线称为边(edge).边的上端节点称为父节点,下端称为子节点.树像是一个不断分叉的树根. 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent).比如说,3,5是6的子节点,6是3,5的父节点:1

二叉搜索树(BST)---python实现

github:代码实现 本文算法均使用python3实现 1. 二叉搜索树定义 ??二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). ??二叉搜索树是具有有以下性质的二叉树: ??(1)若左子树不为空,则左子树上所有节点的值均小于或等于它的根节点的值. ??(2)若右子树不为空,则右子树上所有节点的值均大于或等于它的根节点的值. ??(3)左.右子树也分别为二叉搜索树. 2. 二叉搜索树的相关操作 2.1 插入操作 ??从根节点开始,若插入

二叉搜索树的后序遍历序列——24

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入数组的任意两个数组都互不相同. 二叉搜索树的特点就是每个结点的左子树的值都比自身的值小,而右子树的值都比自身值要大.比如如上的二叉搜索树后序遍历的结果就是{5,7,6,9,11,10,8},但是题意并不是给出一棵二叉搜索树让判断数组是否为后序遍历序列,而是只有一组数据让判断是否为某个二叉搜索树的后序遍历结果,因此之能依据二叉搜索树后序遍历结果的特点来进行分析判断: 就拿上面的结果来说

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

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 之前对于二叉搜索树,只知道中序遍历是递增的,今天做到这道题目,要求判断数组是不是二叉搜索树后序遍历的结果,一开始有点懵,后来在纸上画画,感觉很像递归的感觉,有一种特别像归并排序的那种感觉一样,然后发现对于每一个树的子结构而言,我们将其分成左右子树两部分就可以很明白这种递归的结构了,分成两部分,然后分别对左右在递归,直到叶子节点 1 public c

二叉搜索树的深度与搜索效率图解

二叉搜索树的深度与搜索效率 我们在树, 二叉树, 二叉搜索树中提到,一个有n个节点的二叉树,它的最小深度为log(n),最大深度为n.比如下面两个二叉树: 深度为n的二叉树 深度为log(n)的二叉树 这两个二叉树同时也是二叉搜索树(参考树, 二叉树, 二叉搜索树).注意,log以2为基底.log(n)是指深度的量级.根据我们对深度的定义,精确的最小深度为floor(log(n)+1). 我们将处于同一深度的节点归为一层.如果除最后一层外的其他层都被节点填满时,二叉树有最小深度log(n). 二

LeetCode 109——有序链表转化二叉搜索树

1. 题目 2. 解答 2.1. 方法一 在 LeetCode 108--将有序数组转化为二叉搜索树 中,我们已经实现了将有序数组转化为二叉搜索树.因此,这里,我们可以先遍历一遍链表,将节点的数据存入有序数组中,然后再将有序数组转化为二叉搜索树即可. class Solution { public: TreeNode* sortedListToBST(ListNode* head) { vector<int> nums; while (head != NULL) { nums.push_bac