二叉树前序遍历

Posted crazybird123

tags:

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

#include <iostream>
#include <vector>
#include <stack>

struct BinaryTreeNode{
    int val;
    BinaryTreeNode* left;
    BinaryTreeNode* right;
    BinaryTreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

//递归法
void traveral(BinaryTreeNode*cur, std::vector<int>&nums)
{
    if (cur == nullptr)
    {
        std::cout << "cur is null" << std::endl;
        return;
    }
    else{
        std::cout << "cur node: " << cur->val << ", ";
        nums.push_back(cur->val);
        std::cout << "traveral left" << ", ";
        traveral(cur->left, nums);
        std::cout << "traveral right" << ", ";
        traveral(cur->right, nums);
    }
}


std::vector<int> PreorderTraversalRecursion(BinaryTreeNode* root)
{
    std::vector<int> result;
    traveral(root, result);
    return result;
}

//迭代法
std::vector<int> PreorderTraversalIterator(BinaryTreeNode* root)
{
    std::stack<BinaryTreeNode*> st;
    std::vector<int> result;
    if (root == nullptr)
    {
        return result;
    }

    st.push(root);//root进栈
    while (!st.empty())
    {
        BinaryTreeNode* node = st.top();//

        st.pop();//弹出
        result.push_back(node->val);//当前节点值
        if (node->right)
        {
            st.push(node->right);//右节点
        }
        if (node->left)
        {
            st.push(node->left);//左节点
        }
    }
    return result;
}

int main()
{
    BinaryTreeNode *nodeOne = new BinaryTreeNode(1);
    BinaryTreeNode *nodeTwo = new BinaryTreeNode(2);
    BinaryTreeNode*nodeThree = new BinaryTreeNode(3);
    BinaryTreeNode*nodeFour = new BinaryTreeNode(4);
    BinaryTreeNode*nodeFive = new BinaryTreeNode(5);
    BinaryTreeNode*nodeSix = new BinaryTreeNode(6);

    //       1
   //      2   3
  //      4 5
 //          6
//1-2-4-5-6-3
    nodeOne->left = nodeTwo;
    nodeOne->right = nodeThree;

    nodeTwo->left = nodeFour;
    nodeTwo->right = nodeFive;

    nodeFive->right = nodeSix;

    std::vector<int>resultsRecursion;
    resultsRecursion = PreorderTraversalRecursion(nodeOne);
    for (std::vector<int>::iterator it = resultsRecursion.begin(); it != resultsRecursion.end(); it++)
    {
        std::cout << (*it) << ", ";
    }

    std::cout << std::endl<< "-------------------------------------" << std::endl;
    std::vector<int>resultsIteration;
    resultsIteration = PreorderTraversalIterator(nodeOne);
    for (std::vector<int>::iterator it = resultsIteration.begin(); it != resultsIteration.end(); it++)
    {
        std::cout << (*it) << ", ";
    }
}

 

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

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

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

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

二叉树前序,中序,后序遍历迭代实现详解

已知二叉树前序和中序,求二叉树。

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