C语言非递归后序遍历二叉树

  

本文实例为大家分享了C语言非递归后序遍历二叉树的具体代码,供大家参考,具体内容如下

  

<>强法一:强实现思路:一个栈先按根→右子树→左子树的顺序访问二叉树。访问时不输出。另一个栈存入前一个栈只进栈的结点。
  最后输出后一个栈的结点数据。

        # include   # include   typedef struct TreeNode {   char元素;   struct TreeNode *, *;   * BTree}树;   typedef struct StackNode {   BTree数据;   struct StackNode *下;   * PStack}堆栈;   typedef struct {   PStack最高;   * PLinkStack} LinkStack;//初始化空栈   PLinkStack Init_Stack (void) {   PLinkStack年代;   S=(PLinkStack) malloc (sizeof (LinkStack));   如果(S) {   年代→高级=零;   }   返回年代;   }//压栈   空白Push_Stack (PLinkStack年代,BTree T) {   PStack p;   p=(PStack) malloc (sizeof(栈));   p→数据=https://www.yisu.com/zixun/T;   p未来=S ->高级->;   S ->高级=p;   }//判空   int empty_Stack (PLinkStack S) {   如果(S ->上){   返回0;   其他}{   返回1;   }   }//出栈   PStack Pop_Stack (PLinkStack S) {   PStack问;   如果(empty_Stack (S)) {   返回S ->最高;   其他}{   q=S ->高级;   S ->高级=S ->高级->下一个;   }   返回问;   }//销毁栈   空白DestroyStack (PLinkStack S) {   PStack del;   而(S ->高级!=NULL) {   德尔=S ->高级;   S ->高级=S ->高级->下一个;   自由(del);   }   自由(S);   }   BTree BuildTree (void) {   char ch;   BTree节点;   ch=获取字符();   如果(ch==' # ') {   节点=零;   其他}{   节点=(BTree) malloc (sizeof(树));   节点→元素=ch;   节点→左=BuildTree ();   节点→右=BuildTree ();   }   返回节点;   }   空白NotRecursionPostOrder (BTree T) {   PLinkStack年代,计算机科学;   S=Init_Stack ();   c=Init_Stack ();   而(T | | ! empty_Stack (S)) {   如果(T) {   Push_Stack (S, T);   Push_Stack (c T);   T=T→正确;   其他}{   T=Pop_Stack (S)→数据;   T=T→左;   }   }   而(CS→顶!=NULL) {   printf (" % c, c→高级→→数据元素);   CS→高级=c→高级→下;   }   DestroyStack (CS);   }   int主要(空白){   BTree T;   T=BuildTree ();   NotRecursionPostOrder (T);   返回0;   }      

 C语言非递归后序遍历二叉树

  

<>强法二:强实现思路。按先序遍历访问每一个结点。存入栈中,当为空时,就出立即栈(第一次出栈)。出栈后应该立即进栈,去访问进栈结点的右结点,这样可以保证先输出左,右结点,再输出根结点。二次进栈利用国旗标记。

        # include   # include   typedef struct TreeNode {   char元素;   int国旗;   struct TreeNode *, *;   * BTree}树;   typedef struct StackNode {   BTree数据;   struct StackNode *下;   * PStack}堆栈;   typedef struct {   PStack最高;   * PLinkStack} LinkStack;//初始化空栈   PLinkStack Init_Stack (void) {   PLinkStack S=(PLinkStack) malloc (sizeof (LinkStack));   如果(S) {   年代→高级=零;   }   返回年代;   }//压栈   空白Push_Stack (PLinkStack年代,BTree T) {   PStack p;   p=(PStack) malloc (sizeof(栈));   p→数据=https://www.yisu.com/zixun/T;   p未来=S ->高级->;   S ->高级=p;   }//判空   int empty_Stack (PLinkStack S) {   如果(S ->上){   返回0;   }   其他{   返回1;   }   }//出栈   PStack Pop_Stack (PLinkStack S) {   PStack q=S ->高级;   S ->高级=S ->高级->下一个;   返回问;   }   BTree BuildTree (void) {   BTree t;   char ch;   ch=获取字符();   如果(ch==' # ') {   t=零;   }   其他{   t=(BTree) malloc (sizeof(树));   t→元素=ch;   t→左=BuildTree ();   t→右=BuildTree ();   }   返回t;   }   空白DestroyStack (PLinkStack S) {   PStack p;   而(S→) {   p=S→顶;   自由(p);   年代→高级=S→高级→下;   }   }   空白NotRecursionPostOrder (BTree T) {   PLinkStack年代;   S=Init_Stack ();   而(T | | ! empty_Stack (S)) {   如果(T) {   T→国旗=0;   Push_Stack (S, T);   T=T→左;   }   其他{   T=Pop_Stack (S)→数据;   如果(T→标志==0){   T→标志=1;   Push_Stack (S, T);   T=T→正确;   }   其他{   如果(T→标志==1){   printf (" % c T→元素);   T=零;   }   }   }   }   DestroyStack(年代);//销毁栈   }   int主要(空白){   BTree T;   T=BuildTree ();   NotRecursionPostOrder (T);   返回0;   }

C语言非递归后序遍历二叉树