144. 二叉树的前序遍历
题目链接:144. 二叉树的前序遍历
前序遍历思路–迭代
- 前序遍历是中左右,每次先处理的是中间节点,
- 那么先将根节点放⼊栈中,然后将右子树加⼊栈,再加⼊左左子树。
- 为什么要先加⼊右子树,再加⼊左子树呢?
- 因为这样出栈的时候才是中左右的顺序。
- (注意代码中空节点不⼊栈)
/**
* 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> v;
if(root == NULL) return v;
st.push(root);
while(!st.empty())
{
TreeNode* node = st.top();
st.pop();
v.push_back(node->val);
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
}
return v;
}
};
94. 二叉树的中序遍历
题目链接:94. 二叉树的中序遍历
前序遍历思路–迭代
在使⽤迭代法写中序遍历,就需要借⽤指针的遍历来帮助访问节点,栈则⽤来处理节点上的元素
/**
* 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> inorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> v;
TreeNode* cur =root;
if(root ==NULL) return v;
//cur不为空,保证能够遍历树,栈不为空,保证有数据还能出栈
while(cur!=NULL || !st.empty())
{
//先入左结点
if(cur !=NULL)
{
st.push(cur);
cur = cur->left;
}
else //当左结点为空时候,再出栈访问根结点
//访问完后继续入右结点
{
cur = st.top();
st.pop();
v.push_back(cur->val);
cur = cur->right;
}
}
return v;
}
};
145. 二叉树的后序遍历
题目链接: 145. 二叉树的后序遍历
后序遍历思路–迭代
前序遍历是中左右:后序遍历是左右中,我们可以先访问中,再入左,再入右,这样出栈就是先右左,访问就是中右左,再反转数组即可:左右中;
其实就是前序遍历的时候,调整了入栈的顺序,同时再反转数组就是后序遍历了!
/**
* 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> v;
if(root == NULL) return v;
st.push(root);
while(!st.empty())
{
TreeNode* node = st.top();
st.pop();
v.push_back(node->val);
if(node->left) st.push(node->left);
if(node->right) st.push(node->right);
}
reverse(v.begin(),v.end());
return v;
}
};