文章目录
- 二叉树的镜像
- 判断是不是二叉搜索树
二叉树的镜像
题目链接:二叉树的镜像
解题思路1:递归
对于树的问题,我们可以把整体看作一棵树,把左右子树看作独立的树进行操作,所以对于树的问题,一般情况下都可以考虑用递归来解决
题目代码:
后序版本:
class Solution {
public:TreeNode* Mirror(TreeNode* pRoot) {//空树返回if(pRoot == nullptr) return nullptr;//递归子树TreeNode* left = Mirror(pRoot->left);TreeNode* right = Mirror(pRoot->right);TreeNode* temp = pRoot->left;pRoot->left = pRoot->right;pRoot->right = temp;return pRoot;}
};
先序版本:
class Solution {
public:TreeNode* Mirror(TreeNode* pRoot) {//空树返回if(pRoot == nullptr) return nullptr;//递归子树TreeNode* temp = pRoot->left;pRoot->left = pRoot->right;pRoot->right = temp;TreeNode* left = Mirror(pRoot->left);TreeNode* right = Mirror(pRoot->right);return pRoot;}
};
解法二:深度优先遍历,我们可以借助栈来对二叉树进行遍历
class Solution {
public:TreeNode* Mirror(TreeNode* pRoot) {if(pRoot == nullptr) return nullptr;stack<TreeNode*> s;s.push(pRoot);while(!s.empty()){TreeNode* node = s.top();s.pop();if(node->left) s.push(node->left);if(node->right) s.push(node->right);TreeNode* temp = node->right;node->right = node->left;node->left = temp;}return pRoot;}
};
判断是不是二叉搜索树
题目链接:判断是不是二叉搜索树
解题思路:递归
排除所有非二叉搜索树的情况,反向返回
class Solution {
public:
//中序遍历判断long pre = INT_MIN;bool isValidBST(TreeNode* root) {if(root == nullptr) return true;//进入左子树if(!isValidBST(root->left)) return false;if(root->val <= pre) return false;//更新pre值pre = root->val;//进入右子树if(!isValidBST(root->right)) return false;return true;}
};
解题思路2:借助栈来实现遍历,借助数组来保存中序遍历结果,对数组中中序遍历的结果进行比较
二叉搜索树非常特征的一个特征就是二叉搜索树的中序遍历结果是递增的
代码如下:
class Solution {
public:
//利用栈bool isValidBST(TreeNode* root) {stack<TreeNode*> s;//辅助栈vector<int> v;//保存中序遍历结果while(root!=nullptr || !s.empty()){while(root != nullptr) {s.push(root);root = root->left;}TreeNode* node = s.top();v.push_back(node->val);s.pop();//进入右节点root = node->right;}int n = v.size();for(int i=0; i<n-1; ++i){if(v[i+1] <= v[i]) return false;}return true;}
};