二叉树的遍历(递归与非递归)

来源:互联网 发布:30岁男士护肤 知乎 编辑:程序博客网 时间:2024/05/22 18:24

前序遍历:

操作顺序为:父节点 -> 左儿子 -> 右儿子


递归版本

struct node{    int data;    struct node * left;    struct node * right;};void preOrder(node *root){    if(root != NULL)    {        cout<<root->data<<" ";        preOrder(root->left);        preOrder(root->right);    }}

非递归版本

void preOrderStack(node *root){    stack<node *> s;    while(root != NULL || !s.empty())    {        if(root != NULL)        {            cout<<root->data<<" ";            s.push(root);            root = root->left;        }        else        {            root = s.top();            s.pop();            root = root->right;        }    }}


中序遍历:

操作顺序为:左儿子 -> 父节点 -> 右儿子


递归版本

void midOrder(node *root){    if(root != NULL)    {        midOrder(root->left);        cout<<root->data<<" ";        midOrder(root->right);    }}


非递归版本

void midOrderStack(node *root){    stack<node *> s;    while(root != NULL || !s.empty())    {        if(root != NULL)        {            s.push(root);            root = root->left;        }        else        {            root = s.top();            s.pop();            cout<<root->data<<" ";            root = root->right;        }    }}


后序遍历:

操作顺序为:左儿子 -> 右儿子 -> 父节点


递归版本

void postOrder(node *root){    if(root != NULL)    {        postOrder(root->left);        postOrder(root->right);        cout<<root->data<<" ";    }}


非递归版本

void postOrderStack(node *root){    stack<node *> s;    node *cur;    node *pre = NULL;    s.push(root);    while(!s.empty())    {        cur = s.top();        if((cur->left == NULL && cur->right == NULL) || (pre != NULL && (cur->left == pre || cur->right == pre)))        {            cout<<cur->data<<" ";            pre = cur;            s.pop();        }        else        {            if(cur->right != NULL)                s.push(cur->right);            if(cur->left != NULL)                s.push(cur->left);        }    }}





0 0