二叉树的三种遍历递归法和非递归法(前序、中序、后续)

来源:互联网 发布:贪心算法题目 编辑:程序博客网 时间:2024/05/06 09:00

二叉树的前序遍历:根->左->右

1、递归方法:

思路:我们知道递归就是将一个大问题不断分成子问题进行处理,当达到递归终止条件时,跳出。因此在前序遍历中我们把每一个节点分成三部分,即:根节点、左子树、右子树。

例如下面这个二叉树递归过程:

这里写图片描述

转化成代码代码:

void PrevOrder()     //1、递归法    {    Node* root = _Root;    _PrevOrder(root);}void _PrevOrder(Node* root){    if (root)    {        cout<<root->_Data<<endl;        _PrevOrder(root->_Left);        _PrevOrder(root->_Right);    }}

2、非递归法

思路:不用递归去遍历,我们如何获得上个节点的信息呢??这里,我们可以建立一个栈,这个栈用于保存每次化成子问题的根结点。

例如下面这个二叉树非递归过程:

这里写图片描述

代码:

void PrevOrderNonR()  //2、非递归法(利用栈的思想){    Node* cur = _Root;    stack<Node*> s;    while (!s.empty() || cur)    {        while(cur)        {            cout<<cur->_Data<<"  ";            s.push(cur);            cur = cur->_Left;        }        Node* top =  s.top();        s.pop();        cur = top->_Right;    }} 

二叉树的中序遍历:左->根->右

1、递归方法:

void InOrder()   //中序递归遍历{    _InOrder(_root);    cout << endl;}void _InOrder(Node* root){    if (root != NULL)    {        _InOrder(root->_left);        cout << root->_data << "  ";        _InOrder(root->_right);    }}

2、非递归方法:

void InOrderNoR() //中序非递归遍历    {        stack<Node*> s;        Node* cur = _root;        while (cur ||  !s.empty())        {            while (cur)            {                s.push(cur);                cur = cur->_left;            }            Node* top = s.top();            cout << top->_data << "  ";            s.pop();            cur = top->_right;        }        cout << endl;    }

二叉树的后序遍历:左->右->根

1、递归方法:

    void PostOrder() //后续递归{    _PostOrder(_root);    cout << endl;}    void _PostOrder(Node* root){    if (root != NULL)    {        _PostOrder(root->_left);        _PostOrder(root->_right);        cout << root->_data << "  ";    }}

2、非递归方法:

void PostOrderNoR() //后续非递归{    stack<Node*> s;    Node* cur = _root;    Node* prev = NULL;    while (cur || !s.empty())    {        while (cur)        {            s.push(cur);            cur = cur->_left;        }        Node* top = s.top();        if (top->_right == NULL || top->_right == prev)        {            cout << top->_data << "  ";            prev = top;            s.pop();        }        else        {            cur = top->_right;        }    }    cout << endl;}
阅读全文
0 0