判断二叉树是否二叉排序树(BST)

算法思想:由于二叉排序树的中序遍历可以得到一个有序的序列,因此,我们可以使用中序遍历进行求解。

代码如下:

 1 #include <stack>
 2 using namespace std;
 3
 4 typedef struct BinaryTree
 5 {
 6     int data;
 7     BinaryTree *lc;
 8     BinaryTree *rc;
 9 }BTNode,*BinaryTree;
10
11 bool isBST(BinaryTree T)
12 {
13     int prevalue = INT_MIN; //获取最小整型数,初始化prevalue
14     stack<BinaryTree> s;
15     BinaryTree p = T;
16     while(p||!s.empty())
17     {
18         if(p)
19         {
20             s.push(p);
21             p = p->lc;
22         }
23         else
24         {
25             p=s.top();
26             s.pop();
27             if(prevalue>p->data)    //判断前一个结点的值是否不满足二叉排序树的条件
28                 break;//跳出循环,早外面判断
29             prevalue = p->data;
30             p = p->rc;
31         }
32     }
33     if(!p && s.empty())
34         return true;
35     else
36         return false;
37 }

也可以用递归实现

代码如下:

 1 typedef struct BinaryTree
 2 {
 3     int data;
 4     BinaryTree *lc;
 5     BinaryTree *rc;
 6 }BTNode,*BinaryTree;
 7
 8 int prevalue = INT_MIN; //获取最小整型数,初始化prevalue
 9 bool isBST(BinaryTree T)
10 {
11     bool b1,b2;
12     if(!T)
13         return true;
14     else
15     {
16         b1 = isBST(T->lc);
17         if(b1 ==false||prevalue>T->data)
18             return false;
19         prevalue = T->data;
20         b2 = isBST(T->rc);
21         return b2;
22     }
23 }
时间: 2024-11-10 10:42:06

判断二叉树是否二叉排序树(BST)的相关文章

(树)判断二叉树是否为BST

题目:判断一颗二叉树是否为BST. 思路:其实这个问题可以有多个解决方法. 方法一:递归解决.根据BST的特性.左边的小于根节点的值,右边的大于根节点的值.并且对于每一棵子树都是如此.所以我们可以直接递归的对左右子树的值与根节点的值进行比较.左子树的值小于当前根节点的值,将当前根节点的值作为最大值传入左子树,左子树的值都小于他,递归处理:右子树的值都大于根节点的值,将根节点的值作为最小值传入右子树,右子树的值都大于他. 代码: /** * Definition for binary tree *

判断一棵二叉树是否为BST,一棵树是否为完全二叉树

对于一颗搜索二叉树,最简单的方法就是用中序遍历,看是不是一个递增数列,如果是则是一颗搜索二叉树,如果不是则不是搜索二叉树.在这里用一个lastVisit去记录上一次搜索到的节点.整个过程就是先找到最左下角的节点,更新这个lastVisit为这个节点的值,然后按照中序遍历依次更新即可.代码如下. 1 #include <stdio.h> 2 #include <climits> 3 4 //二叉树结点 5 typedef struct binary_tree_node_t{ 6 bi

判断二叉树是否平衡

题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 注:这里不考虑该二叉树是否是二叉排序树 解决要点: 1.后序遍历二叉树: 2.递归. 核心算法: bool isBalanced(pTree pT,int *depth) { if(!pT)//参数判断 { *depth = 0; return true; } //后序遍历 int left,right; if(isBalanced(pT->lChild,&

【LeetCode】98. Validate Binary Search Tree -判断是否为二叉排序树

一.描述: 二.思路: 二叉排序树(BST),中序遍历的结果一定是非递减序列(来自百度百科): 本题中对于BST的定义是要么大于,要么小与,即遍历结果只能是递增序列,故可以通过判断中序遍历的结果序列是否是递增序列,来判断是否为合法BST: 另一种方法是使用递归: 三.代码: 1.非递归,通过中序遍历结果判断: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left;

二叉排序树(BST)

二叉排序树: 二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树. 它或者是一棵空树:或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树: 注:中序遍历一棵二叉排序树会得到一个有序序列. 考虑序列5,3,7,2,4,8,对应的二叉排序树构造过程如下: 实现: /*************

STL源码笔记(17)—二叉排序树BST(C++封装)

二叉排序树BST STL中还有一类非常重要的容器,就是关联容器,比如map啊set啊等等,这些容器说实话,在应用层上还不能完全得心应手(比如几种容器效率的考虑等等),更别说源码了,因此这一部分打算稳扎稳打,好好做做笔记研究一番. 说到关联容器,我们想到了什么AVL树,红黑树等等,但大多时候我们仅仅局限于知道其名字,或者知道其概念,俗话说"talk is cheap,show me the code",因此,我打算从他们的祖爷爷二叉排序树开始下手.(其实,侯老师的书上也是这么安排的哈)

二叉排序树查找所在层次 与判断是否为二叉排序树

二叉排序树 二叉排序树的递归查找 二叉排序树的插入 二叉排序树的创建 二叉排序树的删除 提示:判断是否为二叉排序树时,根据二叉排序树的性质,在进行中序遍历的时候,当前结点的值总是大于前驱结点的值, 需要在遍历时保存前驱结点的值,这样有利于进行判断,基于这样的思路来进行解题. #include <iostream> using namespace std; #define ENDFLAG -1 //char a[10]={'5','6','7','2','1','9','8','10','3',

LeetCode:Symmetric Tree - 判断二叉树是否对称

1.题目名称 Symmetric Tree(判断二叉树是否对称) 2.题目地址 https://leetcode.com/problems/symmetric-tree/ 3.题目内容 英文:Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). 中文:给定一颗二叉树,检查它是否与自己的镜像是同一棵树(即围绕根节点对称). 4.解题方法 本题与题目"Same Tr

编程算法 - 判断二叉树是不是平衡树 代码(C)

判断二叉树是不平衡树 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一颗二叉树的根结点, 判断该树是不是平衡二叉树. 二叉平衡树: 任意结点的左右子树的深度相差不超过1. 使用后序遍历的方式, 并且保存左右子树的深度, 进行比较. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <std