LeetCode刷題第一題------判斷一個二叉樹是不是二叉搜索樹

1.二叉搜索樹的簡介

  • 性質

二叉查找樹(Binary Search Tree),(又:二叉搜索樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹

  1. 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
  2. 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
  3. 它的左、右子樹也分別爲二叉排序樹;
  4. 右子樹的結點的值一定大於等於左子樹結點的值。
  • 應用
  1. 插入一個數值
  2. 查詢是否包含某個數值
  3. 刪除某個數值
  • 算法實現

     1.查找:遞歸查找是否存在key。

     2.插入:原樹中不存在key,插入key返回true,否則返回false。

     3.構造:循環的插入操作。

     4.刪除:

              (1)葉子節點:直接刪除,不影響原樹。

              (2)僅僅有左或右子樹的節點:節點刪除後,將它的左子樹或右子樹整個移動到刪除節點的位置就可以,子承父業。

              (3)既有左又有右子樹的節點:找到須要刪除的節點p的直接前驅或者直接後繼s,用s來替換節點p,然後再刪除節點s

2.LeetCode題目介紹

3.題目解法及解析

第一種做法:中序遍歷遞歸

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int* last=NULL;//用於存儲中序遍歷遍歷的上一個的值
    bool isValidBST(TreeNode* root) {
        if(root){
            if(!isValidBST(root->left)) return false;//如果左子樹不是二叉排序樹返回false
            if(last&&*last>=root->val) return false;//如果當前點的值小於上一個中序遍歷的值則返回false
            last = &root->val;//重置中值遍歷的值
            if(!isValidBST(root->right)) return false;//如果右子樹不是二叉排序樹返回false
            return true;
        }else return true;//空樹返回true

    }
};

第二種做法:把中序遍歷的值存入數組,然後判斷是否是升序的即可,由於算法效率較底不予實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章