Exemplo n.º 1
0
//先序
void MyTree::PreTraverse(TreeNode* pNode)
{
//   if(pNode == NULL)
//   {
//     return;
//   }
// 
//   printf("%d ", pNode->m_Data);
//   PreTraverse(pNode->m_pLeft);
//   PreTraverse(pNode->m_pRight);
  
  MyStack<TreeNode*> ss;
  TreeNode* pCur = pNode;

  do
  {
    while(pCur)
    {
      printf("%d ", pCur->m_Data);
      ss.push(pCur);
      pCur = pCur->m_pLeft;
    }
    
    if(!ss.IsEmpty())
    {
      pCur = ss.pop();
      pCur = pCur->m_pRight;
    }
  }while(pCur || !ss.IsEmpty());
  
}
Exemplo n.º 2
0
//中序
void MyTree::MidTraverse(TreeNode* pNode)
{    
    MyStack<TreeNode*> ss;
    TreeNode* pCur = pNode;
    
    do
    {
        while(pCur)
        {
            ss.push(pCur);
            pCur = pCur->m_pLeft;
        }
        
        if(!ss.IsEmpty())
        {
            pCur = ss.pop();
            printf("%d ", pCur->m_Data);
            pCur = pCur->m_pRight;
        }
    }while(pCur || !ss.IsEmpty());
}
Exemplo n.º 3
0
void MyTree::RemoveAll()
{
    MyStack ss;
    TreeNode *pCurNode = m_pRoot;
    TreeNode *pLastNode = NULL;

    while (true)
    {
        while (pCurNode != NULL)
        {
            ss.push(pCurNode);
            pCurNode = pCurNode->m_pLeft;
        }
        if (ss.IsEmpty())
        {
            break;
        }
        pCurNode = ss.pop();
        if (pCurNode->m_pLeft == NULL && pCurNode->m_pRight == NULL)
        {
            pLastNode = pCurNode;
        }
        else if (pCurNode->m_pRight == NULL ||
            pCurNode->m_pRight == pLastNode)
        {
            pLastNode = pCurNode;
            Del(pCurNode);
            pCurNode = NULL;
            continue;
        }
        else
        {
            ss.push(pCurNode);
            pCurNode = pCurNode->m_pRight;
            continue;
        }
        
        TreeNode *pDelNode = pCurNode;
        pCurNode = pCurNode->m_pRight;
        Del(pDelNode);
    }
}
    void InfectDeadToNeighborsNonRecursive(vector<vector<char>> &board, int x, int y)
    {
        int     n = board.size();
        if (n == 0)
            return;

        int     m = board.at(0).size();
        if (m == 0)
            return;

        StackElem elem = { 1, x, y };
        stack->Push(elem);

        while (!stack->IsEmpty())
        {
            x = stack->Peak().x;
            y = stack->Peak().y;

            switch (stack->Peak().step)
            {
            case 0:
                stack->Pop(elem);

                break;
            case 1:
                board.at(x).at(y) = 'D';
                printf("Infect %d %d\n", x, y);

                //infect left
                stack->Peak().step = 2;
                if (y - 1 >= 0 && board.at(x).at(y - 1) == 'O')  //step1
                {
                    elem.step = 1;
                    elem.x = x;
                    elem.y = y - 1;
                    stack->Push(elem);
                }

                break;
            case 2:

                //infect right
                stack->Peak().step = 3;
                if (y + 1 < m && board.at(x).at(y + 1) == 'O')  //step2
                {
                    elem.step = 1;
                    elem.x = x;
                    elem.y = y + 1;
                    stack->Push(elem);
                }

                break;
            case 3:
                //infect down
                stack->Peak().step = 4;
                if (x + 1 < n && board.at(x + 1).at(y) == 'O')  //step3
                {
                    elem.step = 1;
                    elem.x = x + 1;
                    elem.y = y;
                    stack->Push(elem);
                }

                break;
            case 4:

                //infect up
                stack->Peak().step = 0;
                if (x - 1 >= 0 && board.at(x - 1).at(y) == 'O')  //step4
                {
                    elem.step = 1;
                    elem.x = x - 1;
                    elem.y = y;
                    stack->Push(elem);
                }
                break;
            default:
                break;
            }
        }

        return;
    }