zoukankan      html  css  js  c++  java
  • 二叉树的非递归中序遍历

      1 #include<iostream>
      2 #include<stack>
      3 using namespace std;
      4 //二叉树的数据结构
      5 struct BiTNode
      6 {
      7     int data;
      8     struct BiTNode *lchild, *rchild;
      9 };
     10  
     11 typedef struct BiTNode  BiTNode;
     12 typedef struct BiTNode* BiTree;
     13 //非递归实现
     14 /*
     15 步骤1:
     16     如果节点有左子树,则入栈;
     17     如果节点没有左子树,则访问该节点;
     18 步骤2:
     19     如果节点有右子树,重复步骤1;
     20     如果节点没有右子树,证明节点访问完毕,根据栈顶指示回退,访问栈顶元素,并访问右子树,重复步骤1;
     21     如果栈为空,则遍历结束
     22 */
     23 //找到中序遍历的起点
     24 BiTNode* goLeft(BiTNode* root, stack<BiTNode*> &s)
     25 {
     26     if (root == NULL)
     27     {
     28         return NULL;
     29     }
     30     //如果root一直有左孩子 则将root入栈
     31     while (root->lchild != NULL)
     32     {
     33         s.push(root);                //入栈
     34         root = root->lchild;            //往下走
     35     }
     36  
     37     //返回起点!
     38     return root;
     39 }
     40 void inOrder2(BiTNode* root)
     41 {
     42     //定义树起点
     43     BiTNode* begin= NULL;
     44     //定义栈
     45     stack<BiTNode*> myStack;
     46     //一直找左子树 直到找到起点
     47     begin = goLeft(root, myStack);
     48     while(begin)
     49     {
     50  
     51         printf("%d ", begin->data);
     52         //如果有右子树 重复GOLEFT
     53         if (begin->rchild != NULL)
     54         {
     55             //现在BEGIN 为右子树中序遍历的起点
     56             begin = goLeft(begin->rchild, myStack);
     57         }
     58         //如果begin没有右子树 根据栈顶指示回退 
     59         else if (!myStack.empty())
     60         {
     61             begin = myStack.top();
     62             myStack.pop();
     63         }
     64         //如果begin没有右子树 myStack为空
     65         else 
     66         {
     67             begin = NULL;
     68         }
     69     }
     70 }
     71  
     72  
     73 //递归实现中序遍历
     74 void inOrder(BiTNode *root)
     75 {
     76     if (root == NULL)
     77     {
     78         return;
     79     }
     80     inOrder(root->lchild);    
     81     printf("%d ", root->data);
     82     inOrder(root->rchild);
     83 }
     84  
     85 void main()
     86 {
     87     BiTNode t1, t2, t3, t4, t5;
     88     memset(&t1, 0, sizeof(BiTNode));
     89     memset(&t2, 0, sizeof(BiTNode));
     90     memset(&t3, 0, sizeof(BiTNode));
     91     memset(&t4, 0, sizeof(BiTNode));
     92     memset(&t5, 0, sizeof(BiTNode));
     93     t1.data = 1;
     94     t2.data = 2;
     95     t3.data = 3;
     96     t4.data = 4;
     97     t5.data = 5;
     98     
     99     t1.lchild = &t2;
    100     t1.rchild = &t3;
    101     t2.lchild = &t4;
    102     t2.rchild = &t5;
    103     inOrder(&t1);
    104     printf("
    ");
    105     inOrder2(&t1);
    106     system("pause");
    107 }
    108  
  • 相关阅读:
    项目用到的分页功能(保存)
    跟上脚步(微信小程序)
    啊!!!贾克斯。
    Javascript闭包——懂不懂由你,反正我是懂了(作者: FrankFang 来源: 博客园)
    OpenCV4Android 之 OpenCV4Android SDK
    OpenCV4Android 之 Android 开发简介
    (-2147483648 > 0)?
    基于能量水平的无线传感器网络拓扑控制研究
    遍历文件夹及其子孙文件夹中的文件
    目标检测中背景建模方法
  • 原文地址:https://www.cnblogs.com/Lxk0825/p/9519988.html
Copyright © 2011-2022 走看看