【问题标题】:Iterative preorder traversal (Debug)迭代前序遍历(调试)
【发布时间】:2012-03-16 20:45:01
【问题描述】:

这里是前序遍历的迭代版本。想法是
将根推入堆栈。
如果左孩子不是 NULL。推左孩子和 root=root->left Else root=Top of stack;Pop;push它的右孩子和root=root->right

它在一些树上工作,但对于一些输入树,它打印一个重复的值。堆栈的行为令人惊讶。它如何从 (4 5 6 8) 变为 (4 6 8)?

    void preorder(node* root)
    {stack<node*> st;
     st.push(root);
     cout<<root->val<<" \n ";
     while(!st.empty())
      {if(root->left!=NULL)
         {st.push(root->left);
          cout<<st.top()->val<<" ";
         // printstack(st);
          root=root->left;
          }
       else{root=st.top();
            st.pop();
           if(root->right!=NULL)
            {st.push(root->right);
             cout<<st.top()->val<<" ";   
             //printstack(st);
              root=root->right;
             }
           }
        }
      }

用于调试的辅助函数 printstack

     void printstack(stack<node*> s)
      {stack<node*> t;
      t=s;
      while(!t.empty())
       {cout<<t.top()->val<<" ";
       t.pop();
       }
      } 

对于这个输入树,打印的堆栈在下面。 预购输出为
8 3 1 6 5 4 4 7 9


______8_ / \ __3_ 9 / \ 1 ___6 / \ 5 7 / 4

3 8

1 3 8

6 8

5 6 8

4 5 6 8

4 6 8 //4的栈顶怎么样??本来应该是5,栈是(5 6 8)

7 8

  9

【问题讨论】:

    标签: c++ algorithm binary-tree


    【解决方案1】:

    这个问题出现在有左子但不是右子的节点上。当节点有一个右孩子时,最后一个 if 块在下一次迭代之前更改根,但没有它,根不会切换。然后,下一次,我们看到一个根(已经从堆栈中弹出)有一个左孩子,所以它的左孩子被压入堆栈并再次访问。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      预购遍历

      初始化: 将 Root 节点压入 Stack

      While(Stack not Emtpy)
      {
        Node = Stack.pop();
        print Node;
        Push Node->right onto the Stack (pushing first, as I need to process left tree first. 
                                     Stack is LIFO)
        Push Node->left onto the Stack
       }
      

      上面的伪代码应该打印 Pre-order traversal。

      【讨论】:

        【解决方案3】:

        这是对您的代码进行修改的正确代码。只需查找更改

        void preorder(node* r1)

            {stack<node*> st;
             st.push(r1);
             node* root;
             root=r1;
             cout<<root->val<<" ";
             while(!st.empty())
              {if(root->left!=NULL)
                 {st.push(root->left);
                  cout<<st.top()->val<<" ";
                  root=root->left;
                  }
               else{root=st.top();
                    st.pop();
                   if(root->right!=NULL)
                    {st.push(root->right);
                     cout<<st.top()->val<<" ";   
                      root=root->right;
                     }
                    else
                    root->left=NULL;
                   }
                }
              }
        

        【讨论】:

          猜你喜欢
          • 2014-01-10
          • 1970-01-01
          • 1970-01-01
          • 2014-08-26
          • 2021-05-17
          • 2011-08-31
          • 2021-10-30
          • 2012-03-11
          • 1970-01-01
          相关资源
          最近更新 更多