判断一棵树是否是二叉搜索树
1.什么是二叉搜索树?
二叉搜索树:如果一棵树为空树,那么是二叉搜索树;如果左子树的所有节点都小于根节点,右子树所有节点都大于根节点,那么是二叉搜索树
2.那么怎么编码呢?
根据BST的定义,我们往往想到使用递归来判断,那么会写出下面的代码,这样是错误的,因为仅能保证:左孩子<根<右孩子,不能保证左子树<根<右子树
public static boolean is_BST(Node head){if(head==null)return true;if(head.left!=null&&head.left.value>head.value)return false;if(head.right!=null&&head.right.value<head.value)return false;if(!is_BST(head.left)||!is_BST(head.right))return true;elsereturn false;}
3.那么怎样改进呢?
保证每次判断的节点都大于左子树最大,小于右子树的最小即可
//获取最大值public static int max_value(Node head){if(head==null)return Integer.MAX_VALUE;while(head.right!=null)head=head.right;return head.value;}//获取最小值public static int min_value(Node head){if(head==null)return Integer.MIN_VALUE;while(head.left!=null)head=head.left;return head.value;}public static boolean is_bst(Node head){if(head==null)return true;//根节点小于左子树最大值,判错if(head.left!=null&&max_value(head.left)>head.value)return false;//根节点大于左子树最小值,判错if(head.right!=null&&min_value(head.right)<head.value)return false;if(!is_BST(head.left)||!is_BST(head.right))return true;elsereturn false;}
3.非递归版本
二叉搜索树是中序有序的,因为左子树<根<右子树
public static boolean is_Bst(Node head){Stack<Node> stack= new Stack<Node>();Vector<Integer> arr=new Vector<Integer>();Node point=head;while(!stack.isEmpty()||point!=null){while(point!=null){stack.push(point);point=point.left;}if(!stack.isEmpty()){point=stack.pop();arr.add(point.value);point=point.right;} }for(int i=1;i<arr.size();i++)if(arr.get(i-1)>arr.get(i))return false;return true;}
判断一棵树是否是二叉搜索树相关推荐
- 数据结构---判断一棵树是否是二叉搜索树
数据结构-判断一棵树是否是二叉搜索树 代码: #pragma once #define N 100 #define elemType BTree* #include<stdlib.h> t ...
- 每天一道LeetCode-----判断某棵树是否是二叉搜索树
Validate Binary Search Tree 原题链接Validate Binary Search Tree 判断一颗树是否是二叉搜索树,一棵树是BST需要满足 一个节点的值大于它左子树所有 ...
- 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
原文:http://blog.csdn.net/sup_heaven/article/details/39313731 数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B ...
- AVL树(平衡二叉搜索树)详解及C++代码实现
AVL树简介 AVL树实际上一个引入了平衡因子的二叉搜索树,该平衡因子保证了每个节点的左右子树高度之差的绝对值不超过1,这样就可以降低树的高度,减少平均搜索长度. 一棵AVL树或者是空树,或者是具有以 ...
- AVL树(平衡二叉搜索树)
AVL树 一.AVL树 1.AVL树的概念 2.AVL树节点的定义(描述) 3.AVL树的插入 4.AVL树的旋转 (1)左单旋 (2)右单旋 (3)左右双旋 (4)右左双旋 (5)插入的整体代码 5 ...
- 【数据结构与算法】之深入解析“把二叉搜索树转换为累加树”和“从二叉搜索树到更大和树”的求解思路与算法示例
一.题目要求 ① 把二叉搜索树转换为累加树 给出二叉搜索树的根节点,该树的节点值各不相同,请将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 no ...
- 判定一棵二叉树是否是二叉搜索树
问题 给定一棵二叉树,判定该二叉树是否是二叉搜索树(Binary Search Tree)? 解法1:暴力搜索 首先说明一下二叉树和二叉搜索树的区别.二叉树指这样的树结构,它的每个结点的孩子数目最多为 ...
- 判断一颗二叉树是否为二叉搜索树(Validate Binary Search Tree)
一.学习要点: 利用二叉搜索树的中序遍历为递增数组的性质: 二.代码: void middle(node* root,vector<int>& inorder) {if(root= ...
- 按照层次序列创建二叉树,并判断二叉树是否为二叉搜索树
首先定义树节点的数据结构,如下: struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; 两个函数,用 ...
最新文章
- 【HDOJ】3345 War Chess
- Lucene:依据索引查找文档
- Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶
- 使用iframe+postMessage跨域操作和通信
- 这个网盘下载60MB/s!PanDownload复活了!
- sublime php语法检查
- ajax传值controller怎么写,ajax向 controller传值(示例代码)
- 【电脑百科】BT种子
- Java——can U do
- php之mysql(数据库的连接)出错问题及解决,cmd操作数据库失败
- linux屏保程序,桌面技巧小贴士 Linux下制作屏保程序
- Word如何插入图片
- Vue在Nginx的使用
- 芯片测试需要掌握什么软件,芯片测试工程师岗位职责
- 阿里云cdn以及阿里云负载均衡配置方法
- 计算机打文档的技巧,电脑word文档下划线怎么打(word文档编辑小技巧)
- 从4G到5G,从物联网到云计算 通信的下一个引爆点在哪里?
- 和菜头-和腾讯新闻哥谈谈腾讯价值观
- 常见的数据分析师的面试问题 完整文件放在GitHub链接上了!!!擅用crtl + F
- 商汤科技研究院招聘见习算法研究员