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


      1 #include<iostream>
      2 #include<stack>
      3 #include<queue>
      4 using namespace std;
      5 typedef struct node
      6 {
      7     char data;
      8     struct node* lchild;
      9     struct node* rchild;
     10 }*Tree;
     11 
     12 void CreateBiTree(Tree &T)   //创建二叉树
     13 {
     14     char ch;
     15     cout << "input:";
     16     cin >> ch;
     17     if (ch=='0')  //0代表该分支结束
     18     {
     19         T = NULL;
     20         cout << "end"<<endl;
     21         return;
     22     }
     23     else
     24     {
     25         //if (T == NULL) return;
     26         T = new node;
     27         T->data = ch;
     28         CreateBiTree(T->lchild);
     29         CreateBiTree(T->rchild);
     30     }
     31 }
     32 
     33 void PreOrder(Tree T)   //先序递归遍历
     34 {
     35     if (T)
     36     {
     37         cout << T->data << " ";
     38         PreOrder(T->lchild);
     39         PreOrder(T->rchild);
     40     }
     41 }
     42 
     43 void InOrder(Tree T) //中序递归遍历
     44 {
     45     if (T)
     46     {
     47         InOrder(T->lchild);
     48         cout << T->data << " ";
     49         InOrder(T->rchild);
     50     }
     51 }
     52 
     53 void PostOrder(Tree T) //后序递归遍历
     54 {
     55     if (T)
     56     {
     57         PostOrder(T->lchild);
     58         PostOrder(T->rchild);
     59         cout << T->data << " ";
     60     }
     61 }
     62 
     63 void NoRecursivePreOrder(Tree T)  //非递归前序遍历
     64 {
     65     stack<Tree> S;
     66     Tree p = T;
     67     while (!S.empty()||p)
     68     {
     69         if (p)
     70         {
     71             cout << p->data << " ";
     72             S.push(p);
     73             p = p->lchild;
     74         }
     75         else
     76         {
     77             p = S.top();
     78             S.pop();
     79             p = p->rchild;
     80         }
     81     }
     82 }
     83 
     84 void NoRecursiveInOrder(Tree T)  //非递归中序遍历
     85 {
     86     stack<Tree> S;
     87     Tree p = T;
     88     while (!S.empty()||p)
     89     {
     90         if (p)
     91         {
     92             S.push(p);
     93             p = p->lchild;
     94         }
     95         else
     96         {
     97             p = S.top();
     98             cout << p->data << " ";
     99             S.pop();
    100             p = p->rchild;
    101         }
    102     }
    103 }
    104 
    105 void NoRecursivePostOrder(Tree T)  //非递归后续遍历
    106 {
    107     stack<Tree> S;
    108     Tree p = T;
    109     Tree pre = NULL;
    110     while (!S.empty() || p)
    111     {
    112         while (p)
    113         {
    114             S.push(p);
    115             p = p->lchild;
    116         }
    117         p = S.top();
    118         if (!p->rchild || p->rchild == pre)
    119         {
    120             cout << p->data << " ";
    121             pre = p;
    122             p = NULL;
    123             S.pop();
    124         }
    125         else
    126             p = p->rchild;
    127     }
    128 }
    129 
    130 void BreadFirstSearch(Tree T)
    131 {
    132     queue<Tree> Q;
    133     Tree p = T;
    134     Q.push(p);
    135     while (!Q.empty())
    136     {
    137         p = Q.front();
    138         cout << p->data << " ";
    139         Q.pop();
    140         if (p->lchild)
    141             Q.push(p->lchild);
    142         if (p->rchild)
    143             Q.push(p->rchild);
    144     }
    145 }
    146 void main()
    147 {
    148     Tree T=NULL;
    149     CreateBiTree(T);
    150     cout << "先序递归遍历:";
    151     PreOrder(T);
    152     cout << "
    先序非递归遍历:";
    153     NoRecursivePreOrder(T);
    154     cout << "
    中序递归遍历:";
    155     InOrder(T);
    156     cout << "
    中序非递归遍历:";
    157     NoRecursiveInOrder(T);
    158     cout << "
    后序递归遍历:";
    159     PostOrder(T);
    160     cout << "
    后序非递归遍历:";
    161     NoRecursivePostOrder(T);
    162     cout << "
    广度优先遍历:";
    163     BreadFirstSearch(T);
    164 }

    以下面二叉树为例:

    输入:0表示当前分支结束

    结果

  • 相关阅读:
    Linux下PATH和LD_LIBRARY_PATH的设置
    WAMP配置虚拟目录
    JDBC使用Demo
    JS点击子元素不触发父元素点击事件(js阻止冒泡)
    jquery页面搜索关键词突出显示
    .net 搜索联想词
    .Net后台调用js,提示、打开新窗体、关闭当前窗体
    Jquery实现按钮点击遮罩加载,处理完后恢复
    Sys.WebForms.PageRequestManagerParserErrorException:无法分析从服务器收到的消息
    Asp.net 后台调用js方法
  • 原文地址:https://www.cnblogs.com/mrlsx/p/5938562.html
Copyright © 2020-2023  润新知