数据结构考试,二叉树的中序遍历的非递归算法是什么?

求大神助攻,简答题和综合题~
2025-03-01 22:07:16
推荐回答(1个)
回答1:

第一题:

bool InOrderTraverse(BinNode *Node,void (*fun)(BinNode *Node)) 
{
      Stack S;//声明栈
      InitBtStack(&);//初始化栈
      while(!StackIsEmpty(&S)||Node)//栈空且节点为NULL是遍历完成
      {
          while(Node->lchild)//如果<节点左子树非空>则进栈,直到左子树为空的节点
          {
                Push(&S,&Node);
                Node = Node->lchild;
          }//while
          (*fun)(Node);               //访问该节点(左子树为空的节点)
          Node = Node->rchlid;         //转向其右子树 
           
         while(!StackIsEmpty(&S)&&!Node)//如果栈非空且右子树为空,弹出并退                 {                     //回栈顶节点,访问之,一直到右子树非空的节点  
                Pop(&S,&Node);
               (*fun)(Node);      //访问之
                Node = Node->rchlid;//转向其右子树(出栈节点的左子树必然已被遍历)
         }//while
      }//while
      DestroyStack(&S);
      return true;
 }//InOrderTraverse

第二题:

第一个while是把栈S的中的元素临时转移到栈T中,直到遇到等于e的(e出栈S但没有进栈T)。

第二个while是把栈T中的元素全部放回栈S中。

结果是 :删除了S栈中<离栈顶最近,值为e>的元素。


第三题:stack 


第四题:

前序串的K应该是D。


树的构型:

                 A

                /  \

              B    F

             /  \      \

          E    C     G

                   \    /  \

                   D  H   J

                          \

                           I

后序序列 :EDCBIHJGFA

根据后序序列易得线索:

E:lchild=NULL right=&D

C:lchild=&D

D:lchild=&E  right=&C  

F:lchild=&G  

H:lchild=&I  

I :lchild=&B  right=&H

J:lchild=&H  right=&G