【144.二叉树的前序遍历】
【145.二叉树的后序遍历】
【94.二叉树的中序遍历】
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<int> st;
vector<int> result;
if (root == NULL)
return result;
result.push_back(root->val);
preorderTraversal(root->right);
preorderTraversal(root->left);
return result;
}
};
- 递归---调用自己这个函数,不需要别的数据结构 迭代---本题需要的是栈
/**
* 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:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if (root == NULL)
return result;
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
if (node->right)
st.push(node->right);
if (node->left)
st.push(node->left);
}
return result;
}
};
- 迭代版 好难懂啊
stack<TreeNode*> st;
栈 可不是一般的栈 而是存放结点指针的栈- 先搁着 下次看
- 不行。。。今天得看:)
- 先序遍历
/**
* 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:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if (root == NULL)
return result;
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
result.push_back(node->val);
st.pop();
if (node->right) st.push(node->right);
if (node->left) st.push(node->left);
}
return result;
}
};
-
看了视频讲解 这次模仿着写过了 注意以下几点
-
前提是 清楚 1)何时 用栈pop()push() 实现结点的访问/遍历 2)何时 将结点的->val值放入result数组 3)注意定义式的数据结构 (------至于为什么选择这样的数据结构原因见下)
stack<TreeNode*> st; vector<int> result;
- 答:当栈不为空的时候 pop出栈顶元素、把栈顶元素->val值存入结果数组、按序push进去右孩子、左孩子
-
思路就是 首先把输入参数根节点(不为空的话)push到栈中(因此该句之前加入一个为空判断 为空的话直接返回return result ------为什么不是return 呢 因为你看所在的函数返回类型是vector
类型啊 如果你写的是return的话就表示无返回值) 然后进入while栈不为空的循环: - 首先用一个当前结点记下栈.top()元素(注意栈里存的不是常见的int类型而是结点指针类型TreeNode*类型 --------为什么不是int类型呢 因为本题就是对结点操作的结点指针类型所包含的信息比单纯一个int类型更丰富 --------为什么不是节点类型TreeNode呢 因为结点指针不占空间不用delete呀)(因此该临时变量也应该是Tree *类型)
- 把这个当前结点从栈中pop出来
- 把这个当前结点->val值 存入Result数组中(注意用result.push_back()函数)(注意存入的是结点->val值 是int类型 而不是TreeNode* 类型)
- 如果当前结点有右孩子 则把右孩子入栈
- 如果当前节点有左孩子 则把左孩子入栈
-
循环结束 return result
-
-
后序遍历--diedaifa
/**
* 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:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if (root == NULL) return result;
st.push(root);
while (!st.empty()) {
TreeNode* curr = st.top();
st.pop();
result.push_back(curr->val);
if (curr->left) st.push(curr->left);
if (curr->right) st.push(curr->right);
}
reverse(result.begin(),result.end());
return result;
}
};
- 把握思路 前序遍历迭代法基础上两点改进
- 交换放入右孩子、左孩子的先后顺序
- 最后的结果数组进行反转
- 注意反转语句
reverse(result.begin(),result.end());
- 注意反转语句
- 中序遍历-----迭代法有些不一样 明天做
明天继续:)