题目:28/100 二叉树的中序遍历
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
题解:
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void inorder(TreeNode* root, vector<int>& res){if(!root)return;inorder(root->left, res);res.push_back(root->val);inorder(root->right, res);}vector<int> inorderTraversal(TreeNode* root) {vector<int> res;//返回一个resinorder(root, res);return res;}
};
方法2:用栈进行迭代
//迭代 用栈的方式
class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> stk;while(root != nullptr || !stk.empty()){//先把左边的压栈while(root != nullptr){stk.push(root);root = root->left;}//得到top元素 就是一溜左元素 得到root元素 到res 再得到右边元素 root = stk.top();stk.pop();res.push_back(root->val);root = root->right;}return res;}
};
题目:29/100不同的二叉搜索树
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
题解:啊感觉好难
题目: 30/100 验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
题解:
用递归的思路,只考虑当前节点,是否左节点小于当前节点,右节点大于当前节点,发现有问题,二叉树需要根节点小于所有左子树节点,大于所有右子树节点。所以子树的根节点即每一个节点root都有一个取值范围,我们写一个辅助函数,传递这两个取值范围
需要好好理解一下题解和这个写法
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isValid(TreeNode* root, TreeNode* min, TreeNode* max){//然后只考虑一个节点 用递归实现其他节点if(!root) return true;if(min!= nullptr && root->val <= min->val)//如果min不为空 那就是右子树,那就要比min大 小就不对{return false;}if(max != nullptr && root->val >= max->val)//如果max不为空 那就是左子树,那就要比max小 大就不对{return false;}return isValid(root->left, min, root) && isValid(root->right, root, max);//左子树就要比root小 右子树就要比root大}bool isValidBST(TreeNode* root) {return isValid(root, nullptr, nullptr);}
};
31/100对称二叉树
题目:给你一个二叉树的根节点 root , 检查它是否轴对称。
题解
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool helper(TreeNode* left, TreeNode* right){if(left == nullptr && right == nullptr) return true;if(left == nullptr || right == nullptr || left->val != right->val) return false;return helper(left->left, right->right) && helper(left->right, right->left);}bool isSymmetric(TreeNode* root) {//只考虑当前节点return helper(root, root);}
};
还要多练习
二叉树的思路整理
1 是否可以通过遍历一遍二叉树得到答案?:用traverse
函数配合外部变量实现—遍历
2 是否可以定义一个递归函数,通过子问题的答案推导出原问题的答案?---- 分解问题
===》 考虑单独抽出一个二叉树节点,需要做什么事情,需要在什么时候(前序?中序?后序?) 递归一定要记住不要多考虑,其他的节点递归函数会执行相同的操作
3 每个节点都会有自己唯一的属于自己的前中后序位置,所以二叉树的问题就是在前中后序位置注入代码逻辑,去达到目的。只需要单独思考每一个节点要做什么,其他的就交给二叉树遍历框架,让递归在所有节点上做相同操作。
4 前序位置是进入一个节点的时候,后序位置是离开一个节点的时候。“当前递归到的节点位置”
5 由4可知,前序位置的代码只能从函数参数中获取父节点传递来的参数,而后序位置的代码不仅从参数得到数据,还可以从子树通过函数返回值传递回来的数据。