非递归二叉树遍历
非递归二叉树遍历
本文主要讨论二叉树的非递归遍历,递归遍历和非递归遍历难度不是一个级别。
前序遍历
非递归前序遍历版本还是挺简单的,直接用一个stack存储节点信息即可。
代码
/**
* 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:
vector<int> preorderTraversal(TreeNode* root) {
if(root == NULL) {
return {
};
}
vector<int> ans;
stack<TreeNode*> s;
s.push(root);
while(!s.empty()) {
TreeNode* tmp = s.top();
s.pop();
ans.push_back(tmp -> val);
//先右后左
if(tmp -> right != NULL) {
s.push(tmp -> right);
}
if(tmp -> left != NULL) {
s.push(tmp -> left);
}
}
return ans;
}
};
中序遍历
非递归中序遍历版本,需要把当前节点的左节点全部入栈,然后再开始弹栈访问,再处理弹栈的节点的右节点。
代码
/**
* 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:
vector<int> inorderTraversal(TreeNode* root) {
if(root == nullptr) {
return {
};
}
vector<int> ans;
stack<TreeNode*> s;
while(!s.empty() || root != nullptr) {
while(root != nullptr) {
s.push(root);
root = root -> left;
}
root = s.top();
s.pop();
ans.push_back(root -> val)