Leetcode题解(30)
98. Validate Binary Search Tree
题目
分析:BST按照中序遍历之后所得到的序列是一个递增序列,因此可以按照这个思路,先中序遍历,保存好遍历的结果,然后在遍历一遍这个序列。判断其是否递增
代码如下:
/** * 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: bool isValidBST(TreeNode* root) { if(NULL == root) return true; vector<int> res; inOrderTraversal(root,res); for(int i=1;i<res.size();i++) { if(res[i]<=res[i-1]) return false; } return true; } void inOrderTraversal(TreeNode* root,vector<int> &res) { if(NULL==root) return; inOrderTraversal(root->left,res); res.push_back(root->val); inOrderTraversal(root->right,res); } };
上面的实现中,使用了一个vector,需要额外的O(n)空间,但是仔细一想,当在保存某一个之值时,只需要判断在它之前的那个数是否小于它,如果小于,则继续遍历,如果不小于,则可以返回false。
代码如下,每次递归调用的时候,都将当前已经遍历的最大数字保存在key中即可
/** * 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: bool isValidBST(TreeNode* root) { if(NULL == root) return true; long long key = -2147483649; return inOrderTraversal(root,key); } bool inOrderTraversal(TreeNode* root,long long &key) { if(NULL==root) return true; bool flag = inOrderTraversal(root->left,key); if(flag == false) return false; if(root->val <= key) { return false; } key = root->val; flag = inOrderTraversal(root->right,key); if(flag == false) return false; return true; } };
-----------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------
100. Same Tree
题目
分析:
判断两棵树结构是否相同,只需要递归判断其左右子树是否分别相同,并且当前节点的值也相同即可。
代码如下:
/** * 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 isSameTree(TreeNode *p, TreeNode *q) { if (NULL == p && NULL == q) { return true; } else if (NULL != p && NULL == q) { return false; } else if (NULL == p && NULL != q) { return false; } if (p->val != q->val) { return false; } return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right); } };
--------------------------------------------------------------------------------------分割线----------------------------------------------------------------------------------
101. Symmetric Tree
题目
分析:
这道题目,其实就是二叉树广度优先遍历的变形,只是每次入队列的方式和广度优先遍历算法中入队列的方式不同,详细见代码
/** * 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 isSymmetric(TreeNode *root) { queue<TreeNode *> myQueue; if (NULL == root) { return true; } if (NULL != root->left && NULL != root->right) { myQueue.push(root->left); myQueue.push(root->right); } else if (NULL == root->left && NULL == root->right) { return true; } else return false; TreeNode *temp1,*temp2; while(!myQueue.empty()) { temp1 = myQueue.front(); myQueue.pop(); temp2 = myQueue.front(); myQueue.pop(); if (NULL == temp1 && NULL == temp2) { continue; } else if (NULL != temp1 && NULL == temp2) { return false; } else if (NULL == temp1 && NULL != temp2) { return false; } else if (temp1->val == temp2->val) { myQueue.push(temp1->left);//左节点 myQueue.push(temp2->right);//右节点 myQueue.push(temp1->right); myQueue.push(temp2->left); } else return false; } return true; } };
----------------------------------------------------------------------------------------------分割线----------------------------------------------------------------------------
102. Binary Tree Level Order Traversal
题目
分析:
二叉树的广度优先遍历,代码如下:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int> > levelOrder(TreeNode *root) { vector<vector<int> > res; stack<vector<int> > tempStack; vector<int> temp; TreeNode *pNode=NULL; temp.clear(); res.clear(); if (NULL == root) { return res; } queue<TreeNode *> myQue; myQue.push(root); while (!myQue.empty()) { myQue.push(NULL);//通过NULL标志进行分层 temp.clear(); pNode = myQue.front(); myQue.pop(); while (NULL != pNode) { temp.push_back(pNode->val); if (NULL != pNode->left) { myQue.push(pNode->left); } if (NULL != pNode->right) { myQue.push(pNode->right); } pNode = myQue.front(); myQue.pop(); } res.push_back(temp); } return res; } };
- 一个后端的前端学习之旅——1.决定学什么
- Appium1.4 的简介、装配及其使用真机测试(IOS版)
- OSChina中远程GIT仓库同步探索
- jQuery原理系列-工具函数
- addEventListener() 方法
- 新浪微博UWP UI意见征求
- 六. Redis发布订阅机制
- iOS入门学习(Objective-c类的声明与实现)
- 无敌子网掩码(IP地址)计算方法(完全心算法)
- RAC中数据文件创建到了本地路径(非系统表空间) 使用rman转移
- 六. Redis发布订阅机制
- java可变参数Varargs
- 收藏一些常用的linux命令,用处很大。
- LIS 两种复杂度解法
- HYSBZ/BZOJ 1008 [HNOI2008] 越狱 - 组合数学
- 进程和线程的使用
- CXF3.0.2+Spring3.2.14 WebService入门实例六
- cocos2d-x 之Scene和Layer
- Android 自定义下拉刷新样式解决方案
- 利用 UltraEdit 重新排版 XML 结构数据