1.二叉树的遍历

来源:互联网 发布:网络诈骗不归网警管辖 编辑:程序博客网 时间:2024/05/16 07:44

二叉树节点结构

struct TreeNode{    int val;    struct TreeNode *right;    struct TreeNode *left;    TreeNode(int _val):val(_val),left(NULL),right(NULL){      } };

先序遍历

  • 访问顺序

    • 先访问根节点
    • 再先序遍历根节点的左子树
    • 再先序遍历根节点的右子树
  • 递归

void RecursivePriorOrder(TreeNode *head){    if(head!=NULL){        cout<<head->val<<" ";        RecursivePriorOrder(head->left);        RecursivePriorOrder(head->right);    }   } 
  • 非递归1
void priorOrder(TreeNode *head){    stack<TreeNode *> S;    TreeNode *p=head;    while(S.size()|| p!=NULL ){        if(p!=NULL){            cout<<p->val<<" ";            S.push(p);            p=p->left;        }else{            p=S.top();            S.pop();            p=p->right;        }    }}
  • 非递归2(另一种实现方法)
void priorOrder1(TreeNode *head){    stack<TreeNode *> S;    TreeNode *p=head;    while(S.size()|| p!=NULL ){        while(p!=NULL)        {            cout<<p->val<<" ";            S.push(p);            p=p->left;        }         p=S.top();        S.pop();        p=p->right;    }}

中序遍历

  • 访问顺序

    • 中序遍历根节点的左子树
    • 再访问根节点
    • 中序遍历根节点的右子树
  • 递归

void RecursiveMiddleOrder(TreeNode *head){    if(head){        RecursiveMiddleOrder(head->left);        cout<<head->val<<" ";        RecursiveMiddleOrder(head->right);    }}
  • 非递归
void middleOrder1(TreeNode *head){    stack<TreeNode *> S;    TreeNode *p=head;    while(p!=NULL || S.size()){        if(p!=NULL){            S.push(p);            p=p->left;        }else{            p=S.top();            S.pop();            cout<<p->val<<" ";            p=p->right;        }    }}
  • 非递归(另一种实现方法)
void middleOrder(TreeNode *head){    if(head==NULL)        return;    TreeNode *p=head;    stack<TreeNode *> stemp;    while(p!=NULL || !stemp.empty()){        while(p!=NULL){            stemp.push(p);            p=p->left;        }        p=stemp.top();        stemp.pop();        cout<<p->val<<" ";        p=p->right;    }}

后序遍历

  • 访问顺序

    • 后序遍历根节点的左子树
    • 后序遍历根节点的右子树
    • 最后访问根节点
  • 递归

void RecursivePostOrder(TreeNode *head){    if(head){        RecursivePostOrder(head->left);        RecursivePostOrder(head->right);        cout<<head->val<<" ";     }} 
  • 非递归(需要一个节点记录前一个访问的节点是什么?)
void postOrder(TreeNode *head){    stack<TreeNode *> S;    TreeNode *p,*pre;    p=head;    pre=NULL;    while(p!=NULL|| S.size() )    {        if(p!=NULL){            S.push(p);            p=p->left;         }else{            p=S.top();            if(p->right==NULL || p->right==pre ){                S.pop();                cout<<p->val<<" ";                pre=p;                p=NULL;             }else{               p=p->right;            }        }    }} 

层次遍历

void BFS(TreeNode *head){    if(head==NULL){        cout<<" THe tree is empty"<<endl;        return;    }     queue<TreeNode * > Que;    TreeNode *p=NULL;    Que.push(head);    while(Que.size()){        p=Que.front();        cout<<p->val<<" ";        Que.pop();        if(p->left)            Que.push(p->left);        if(p->right)            Que.push(p->right);    }}

1 0
原创粉丝点击