二叉树的标准遍历方式有三种,分别为先序遍历、中序遍历和后序遍历,本篇文章主要介绍这三种遍历方式的非递归实现以及通过三种遍历方式中的两种(先序遍历和后序遍历除外)构造出结构化的树。
数据结构如下:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
一、先序遍历:
先序遍历的访问顺序是 root->left->right,可以借用一个栈来实现,对于任意一棵子树,当访问到其根节点时,记为curr,将curr的val放入ans数组中表示已访问过,并且将其出栈。根据栈的性质,需要将right先入栈left后入栈,这样在出栈的时候就能保证先序遍历的顺序了。
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
if (root == NULL) return ans;
stack<TreeNode*> treeStack;
treeStack.push(root);
while(!treeStack.empty()) {
TreeNode *curr = treeStack.top();
treeStack.pop();
ans.push_back(curr->val);
if (curr->right) {
treeStack.push(curr->right);
}
if (curr->left) {
treeStack.push(curr->left);
}
}
return ans;
}
二、中序遍历:
中序遍历的顺序为left->root->right,在遍历过程中,由于访问到的根节点不能直接出栈,如果出栈以后就找不到了,而不出栈的话会涉及到重复访问。
一开始沿着树根的left一直向下走,找到最左叶子节