二叉树前中后层次遍历

Posted beixiaobei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树前中后层次遍历相关的知识,希望对你有一定的参考价值。

 

#include<iostream>
#include<stack>
#include<queue>
using namespace std;

/*
二叉树遍历算法递归+非递归:
前序遍历:根->左->右
中序遍历:左->根->右
后序遍历:左->右->根
层次遍历
*/
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x): val(x),left(NULL),right(NULL) {}
};

/*递归版本*/
void prerecusive(TreeNode *root)
{
    if (!root) return;
    cout << root->val << " ";
    prerecusive(root->left);
    prerecusive(root->right);
}
void inrecusive(TreeNode *root)
{
    if (!root) return;
    inrecusive(root->left);
    cout << root->val << " ";
    inrecusive(root->right);
}
void postrecusive(TreeNode *root)
{
    if (!root) return;
    postrecusive(root->left);
    postrecusive(root->right);
    cout << root->val << " ";
}

/*循环版本。栈做辅助*/
void preiteration(TreeNode *root)
{
    if (!root) return;
    stack<TreeNode *> s;
    s.push(root);
    while (!s.empty())
    {
        cout << s.top()->val << " ";
        s.pop();
        if (root->right) s.push(root->right);
        if (root->left) s.push(root->left);
    }
}
void initeration(TreeNode *root)
{
    if (!root) return;
    stack<TreeNode *> s;
    TreeNode *curr = root;
    while (curr || !s.empty())//s没有值,第一个判断条件是curr不是空
    {
        if (curr)
        {
            s.push(curr);
            curr = curr->left;
        }
        else
        {
            cout << s.top()->val << " ";
            curr = s.top()->right;
            s.pop();
        }
    }
}
void postiteration(TreeNode *root)
{
    if (!root) return;
    stack<TreeNode *> s;
    s.push(root);
    TreeNode *curr;
    TreeNode *visited;//记录子节点已经访问过
    while (!s.empty())
    {
        curr = s.top();
        /*
         * 出栈条件:
         * 对于叶子节点:直接弹出
         * 对于非叶子节点:如果已经遍历过其左子节点或右子节点,则弹出
         */
        if ((!curr->left && !curr->right) || (visited && (curr->left==visited || curr->right == visited)))
        {
            cout << curr->val << " ";
            visited = curr;
            s.pop();
        }
        else
        {
            if (curr->right) s.push(curr->right);
            if (curr->left) s.push(curr->left);
        }
    }
}

void leveltraverse(TreeNode *root)
{
    if (!root) return;
    queue<TreeNode *> q;
    TreeNode *curr;
    q.push(root);
    while (!q.empty())
    {
        curr = q.front();
        cout << curr->val << " ";
        q.pop();
        if (curr->left) q.push(curr->left);
        if (curr->right) q.push(curr->right);
        
    }
}

 

以上是关于二叉树前中后层次遍历的主要内容,如果未能解决你的问题,请参考以下文章

二叉树前中后递归遍历

二叉树前中后序遍历的实现(递归和非递归版)

二叉树前中后自测

二叉树前中后序遍历非递归实现

二叉树前中后序遍历递归转循环

力扣刷题二叉树前中后序遍历