前序 左->根->右
中序 根->左->右
后序 左->右->根
二叉树的节点结构
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) {}
};
二叉树非递归遍历
/**
* 前序遍历
*/
vector<int>preorderTraversal(TreeNode* root){
vector<int>result;
if(root == NULL){
return result;
}
stack<TreeNode*>s;
s.push(root);
while(!s.empty()){
TreeNode *node = s.top();
s.pop();
if(node->left() != NULL){
s.push(node->left);
}
if(node->right() != NULL){
s.push(node->right);
}
}
return result;
}
/**
* 中序遍历
*/
vector<int>inorderTraversal(TreeNode* root) {
vector<int>result;
if (root == NULL) {
return result;
}
stack<TreeNode*>s;
TreeNode* node = root;
while (!s.empty() || node != NULL)
/*
中序遍历的while判断条件是节点不为NULL 或 栈内的元素不为空的情况 下。原因是中序遍历顺序为左根右,所以在遍历的时候需要先把最左节点遍历到,遍历完最左后pop出后其实就是左节点的根节点.此刻遍历pop出的节点的右子树即可完成左根右的遍历操作。
*/
{
while (node!=NULL)
{
s.push(node);
node = node->left;
}
TreeNode* top = s.top();
result.push_back(top->val);
s.pop();
if (top->right != NULL) {
node = top->right;
}
}
return result;
}
/**
* 后序遍历
*/
vector<int>postorderTraversal(TreeNode* root) {
vector<int>result;
if (root == NULL) {
return result;
}
stack<TreeNode*>s1;
stack<TreeNode*>s2;
s1.push(root);
while (!s1.empty()) {
TreeNode* node = s1.top();
s1.pop();
s2.push(node);
/*
先序遍历为根左右
后续变为为左右根
我们不难发现只需要将先序遍历的顺序稍作修改
最后再完全倒过来就是后序遍历了
*/
if(node ->left != NULL){
s1.push(node->left);
}
if (node->right != NULL) {
s1.push(node->right);
}
}
while (!s2.empty()) {
result.push_back(s2.top()->val);
s2.pop();
}
return result;
}
/**
* 层序遍历
*
* 我觉得层序遍历就很清晰。
* 利用队列的先进先出的思想,遍历这层的时候如果下层的左右子节点分别有就把他们入队即可.
*/
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>>result;
if (root == NULL) {
return result;
}
queue<TreeNode*>que;
que.push(root);
while (!que.empty()) {
int len = que.size();//这里取length是为了确定当前层一共有几个节点。因为后面还会入队新的节点
vector<int>level;
for (int i = 0; i < len; i++) {
TreeNode * node = que.front();
level.push_back(node->val);
que.pop();
if (node->left != NULL) {
que.push(node->left);
}
if (node->right != NULL) {
que.push(node->right);
}
}
result.push_back(level);
}
return result;
}