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

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

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        bool isValidBST(TreeNode *root) {
            return isValidBST(root, INT_MIN, INT_MAX);
        }
        bool isValidBST(TreeNode *root, int low, int high){
            if (root == NULL )
                return true;
            if (low < root->val && root->val < high)
                return (isValidBST(root->left, low, root->val) && isValidBST(root->right, root->val, high));
            else
                return false;
        }
    };
  • 方法二:因为BST特性,所以我们可以利用遍历方法对他进行解决。对树进行中序遍历,将结果存储在vector中,如果容器中的值是递增排序的,那么它就是BST,否则就不是。
  • 代码:

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        bool isValidBST(TreeNode *root) {
            vector<int> res;
            isValidBST(root, res);
            int len = res.size();
            bool flag = true;
            for (int i=0; i<len-1; i++){
                if (res[i] >= res[i+1]){
                    flag = false;
                    break;
                }
            }
            return flag;
        }
        void isValidBST(TreeNode *root, vector<int> &res){
            if (root == NULL)
                return;
    
            isValidBST(root->left, res);
            res.push_back(root->val);
            isValidBST(root->right, res);
        }
    };
时间: 2024-10-11 21:40:38

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

树和二叉树总结(三)—BST二叉排序树

二叉排序树的特点:中序遍历是递增的… 下面复习几个常用的操作: 1.如何向BST中插入一个节点 思路:用递归做... 首先,判断head是否为空,为空就是需要插的地方: 然后,判断head的data是不是和新Node一样,一样就是重复Node,不加 最后,若比当前head.data小,则放到插到左节点的树你,否则就插到右节点 public static Node insertBST(Node root, Node keyNode) { if (root== null) { //如果遇到空的地方,

判断二叉树是否二叉排序树(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 preva

树和二叉树

以下的内容做为学习笔记,复制别人的,感觉总结的比较好: 第5章 树和二叉树 本章中主要介绍下列内容:  1.树的定义和存储结构  2.二叉树的定义.性质.存储结构  3.二叉树的遍历.线索算法  4.树和二叉树的转换  5.哈夫曼树及其应用课时分配:     1.2两个学时,3四个学时,4两个学时, 5两个学时,上机两个学时重点.难点:     二叉树的遍历.线索算法.哈夫曼树及其应用 第一节 树 1.树的定义和基本运算1.1 定义    树是一种常用的非线性结构.我们可以这样定义:树是n(n≥

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

数据结构学习笔记(树、二叉树)

树(一对多的数据结构) 树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一颗非空树种: (1)有且仅有一个特定的称为根(Root)的结点: (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1.T2........Tn,其中每一个集合本身又是一棵树,并且称为根的子树. 对于树的定义还需要强调两点:1.n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点.2.m>0时,子树的个数没有限制,但它们一定是互不相交的. 结点

判断二叉树是否平衡

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

编程算法 - 判断二叉树是不是平衡树 代码(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

数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n(≥0)结点组成的有限集合.{N.沃恩}     (树是n(n≥1)个结点组成的有限集合.{D.E.Knuth})      在任意一棵非空树中:        ⑴有且仅有一个没有前驱的结点----根(root).        ⑵当n>1时,其余结点有且仅有一个直接前驱.         ⑶所有结

树和二叉树总结(二)

二叉树的定义和基本概念 0.完全二叉树-->满二叉树的子树,特点->所有节点1~n和满二叉树一一对应... 1.一颗深为k的完全二叉树,包含了2的k次幂-1个节点,每层最大节点数2的(k-1)次幂 2.完全二叉树,深度为logN+1: 3.i==1,节点i是二叉树的Root,i>1时,节点的父节点是i/2,若2i>n,则节点i有左孩子,左孩子编号为2i,否则节点无左孩子,且是叶子节点... 4.同理,若2i+1>n,则节点i有右孩子,右孩子编号为2i+1,否则节点无左孩子 5