leetcode-初級-驗證二叉搜尋樹
阿新 • • 發佈:2018-12-24
題意:判斷一棵樹是否滿足二叉搜尋樹。
二叉搜尋樹的特點:左子樹<根節點<右子樹
解題思路:中序遍歷,鏈棧,來實現。
對於一顆二叉樹,中序遍歷的結果若滿足遞增排序就滿足二叉搜尋樹的條件
/** *解題思路:中序遍歷,鏈棧 * 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); //否則,正常判斷 }