非递归求二叉树的前序中序和后序遍历

Posted tyty-somnuspoppy

tags:

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

一、前序遍历

分析:

1、前序遍历是中左右,因此利用栈,记录栈顶根结点的同时,先压右子树,后压左子树,从而先遍历左子树。

2、每次弹出的栈顶结点符合前序遍历的顺序,因此可直接记录。

3、注意:由于压入栈的是树的结点,所以栈内数据类型为Node*。

struct Node{
    int val;
    Node *left, *right;
};
vector<int> get_preorder(Node *root){
    vector<int> preorder;
    stack<Node*> st;
    st.push(root);
    while(!st.empty()){
        Node* top = st.top();
        st.pop();
        preorder.push_back(top -> val);
        st.push(top -> right);
        st.push(top -> left);
    }
    return preorder;
}

二、中序遍历

分析:

1、中序遍历是左中右,对于一棵树,利用栈,应当先压入右子树的根结点,再压入根结点的值,再压入左子树的根结点。

2、如此操作,当栈顶元素是数字的时候进行记录,因此写一个结构体Stack_Element判断当前压入栈的是结点or结点的值。

struct Node{
    int val;
    Node *left, *right;
};
struct Stack_Element{
    Node *node;
    int val;
    bool isNode;
    Stack_Element(Node *_node, int _val, bool _isNode):node(_node), val(_val), isNode(_isNode){}
};
vector<int> get_inorder(Node *root){
    vector<int> inorder;
    stack<Stack_Element> st;
    st.push(Stack_Element(root, -1, true));//由于该栈中元素为结点,因此他的值为多少并不重要,所以此处设为-1即可
    while(!st.empty()){
        Stack_Element top = st.top();
        st.pop();
        if(top.isNode){
            if(top.node == NULL) continue;
            st.push(Stack_Element(top.node -> right, -1, true));
            st.push(Stack_Element(NULL, top.node -> val, false));
            st.push(Stack_Element(top.node -> left, -1, true));
        }
        else{
            inorder.push_back(top.val);
        }
    }
    return inorder;
}

三、后序遍历

分析:

1、与中序遍历一样要考虑压入栈的元素是结点or结点的值。

2、唯一的区别是遍历顺序,因此将中序遍历的代码(20~22行)稍作改动即可。

struct Node{
    int val;
    Node *left, *right;
};
struct Stack_Element{
    Node *node;
    int val;
    bool isNode;
    Stack_Element(Node *_node, int _val, bool _isNode):node(_node), val(_val), isNode(_isNode){}
};
vector<int> get_postorder(Node *root){
    vector<int> postorder;
    stack<Stack_Element> st;
    st.push(Stack_Element(root, -1, true));//由于该栈中元素为结点,因此他的值为多少并不重要,所以此处设为-1即可
    while(!st.empty()){
        Stack_Element top = st.top();
        st.pop();
        if(top.isNode){
            if(top.node == NULL) continue;
            st.push(Stack_Element(NULL, top.node -> val, false));
            st.push(Stack_Element(top.node -> right, -1, true));
            st.push(Stack_Element(top.node -> left, -1, true));

        }
        else{
            postorder.push_back(top.val);
        }
    }
    return postorder;
}

 

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

二叉树前序中序后序遍历(非递归统一解法)

二叉树的前序中序和后续遍历及应用场景

怎么根据二叉树的前序,中序,确定它的后序

二叉树的前序中序后序遍历相互求法

已知二叉树的中序序列和后序序列,怎么求前序序列

二叉树前序中序和后序的非递归遍历