1. 程式人生 > >leetcode-初級-驗證二叉搜尋樹

leetcode-初級-驗證二叉搜尋樹

題意:判斷一棵樹是否滿足二叉搜尋樹。 
二叉搜尋樹的特點:左子樹<根節點<右子樹 
解題思路:中序遍歷,鏈棧,來實現。 
對於一顆二叉樹,中序遍歷的結果若滿足遞增排序就滿足二叉搜尋樹的條件

/**
 *解題思路:中序遍歷,鏈棧
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
  * };
 */
int flag;
struct Node{//建立一個鏈棧節點
    int val;
    struct Node *next;
};
struct Stack{//建立一個鏈棧
    struct Node *top;//指向鏈棧棧頂節點
    int count;//記錄鏈棧的節點個數
};
void InitStack(struct Stack *stack){//初始化一個空棧
    stack->count = 0;
    stack->top = NULL;
}
void PushStack(struct Stack *stack,int val){//壓棧
    struct Node *node;
    node = (struct Node *)malloc(sizeof(struct Node));
    if(stack->count > 0){
        if(stack->top->val < val){//若不是第一個進棧的節點,則判斷與棧頂節點的值大小,若小於棧頂節點值則說明不是二叉搜尋樹
            node->val = val;
            node->next = stack->top;
            stack->top = node;
            stack->count++;
        }else{
            flag = -1;//若不是二叉搜尋樹設定全域性標誌位flag為-1;
            return;
        }
    }else{//第一個值進棧
        node->val = val;
        node->next = stack->top;
        stack->top = node;
        stack->count++;
    }
}
void Inorder(struct TreeNode *root,struct Stack *stack){//中序遍歷
    if(root == NULL){
        return;
    }
    Inorder(root->left,stack);
    PushStack(stack,root->val);
    Inorder(root->right,stack);
}
bool isValidBST(struct TreeNode *root) {
    flag = 0;
    struct Stack *stack;
    stack = (struct Stack *)malloc(sizeof(struct Stack));
    InitStack(stack);
    Inorder(root,stack);
    if(flag == -1){
        return 0;
    }
    return 1;
}

還是比較麻煩的,答案中有簡單的,引用自:

bool isTree(struct TreeNode *node,int min,int max)
{
	 if (node == NULL) return true;   
    if (node->val < min || node->val > max) return false;  //超出目前子樹所在範圍,不算做樹
    if (node->left != NULL && node->val == INT_MIN) return false;//有左子樹但本身最小,不算
    if (node->right != NULL && node->val == INT_MAX) return false;//有右子樹但本身最大,不算
    return isTree(node->left, min, node->val - 1) && isTree(node->right, node->val + 1, max);  //如果目前正常,去分別搜尋他的左右子樹,更新子樹範圍,作者很皮很牛逼
}

bool isValidBST(struct TreeNode* root) {
	if (!root)  //如果是空樹,是二叉搜尋樹
		return true;
    if(root->left==NULL && root->right ==NULL) //如果是單元素,是二叉搜尋樹
        return true;
	return isTree(root, INT_MIN, INT_MAX);  //否則,正常判斷
}