基于栈来实现二叉树的先根遍历

来源:互联网 发布:好听的网络作家笔名 编辑:程序博客网 时间:2024/05/31 20:51

当年在淘宝最后一面的时候被问过这个问题,当时思路混乱,答的不好。

 

 

#include<iostream>
#include<stack>
using namespace std;


struct Node
{
    Node(char ch)
    {
        c = ch;
          left = NULL;
          right = NULL;
    }
    char c;
     Node* left;
     Node* right;
};

// 由于栈是先进后出,如果先把右子树压栈,再把左子树压栈,由于左子树在栈顶,访问完之后,又会去先压该左子树的右子树,以及该左子树的左子树,以此类推
// 这样就达到了一种用栈模拟递归的效果。

void preOrder(Node* root)
{
    if(!root)
    {
        return;
    }

     stack<Node*> nodeStack;

     nodeStack.push(root);

     while(!nodeStack.empty())
     {
        Node* pNode = nodeStack.top();

          cout << pNode->c;

          nodeStack.pop();

          if(pNode->right)
          {
            nodeStack.push(pNode->right);
          }
          if(pNode->left)
          {
            nodeStack.push(pNode->left);
          }
     }
   
}

int main(int argc, char** argv)
{

   Node* pNodeA = new Node('A');
   Node* pNodeB = new Node('B');
   Node* pNodeC = new Node('C');
   Node* pNodeD = new Node('D');
   Node* pNodeE = new Node('E');
   Node* pNodeF = new Node('F');

   pNodeB->left = pNodeD;
   pNodeC->left = pNodeE;
   pNodeC->right = pNodeF;
   pNodeA->left = pNodeB;
   pNodeA->right = pNodeC;

   preOrder(pNodeA);


}

0 0
原创粉丝点击