链表,栈和队列等线性数据结构的遍历很简单,但是到了非线性遍历方法多了很多。
主要有两类:深度优先遍历(DFS)和广度优先遍历(BFS)。这里你可能会想到,不应该是前序、中序、后序遍历吗。没错,这些其实就是深度优先遍历的几种方式。而广度优先遍历的访问原则“先上后下-先左后右”,所以不像深度优先优先遍历,根据访问节点方式的不同有不同方式。

image from dsacpp.3rd_edn-min.png

深度优先遍历

1.递归实现

// 前序递归遍历T
void preOrder(TreeNode *root) {
    if(root == NULL)
        return;
    cout << root->val << endl;
    preOrder(root->left);
    preOrder(root->right);
}

2.非递归实现

void preOrder(TreeNode *root) {
    if(root == NULL)
        return;

    stack<TreeNode *> stk;
    stk.push(root);
    while(!stk.empty()) {
        TreeNode *pNode = stk.top();
        stk.pop();
        cout << pNode->val << endl;
        if(pNode->right != NULL)
            stk.push(pNode->right);
        if(pNode->left != NULL)
            stk.push(pNode->left);
    }
}

广度优先遍历

// 用queue实现的BFS  
void BFS(Node *pRoot) {  
    if (pRoot==NULL)  
        return;  
  
    queue<Node*> Q;
    Q.push(pRoot);  
  
    while(!Q.empty()) {    
        Node *node = Q.front();
        cout<<node->nVal<<"->";  
        if (node->pLeft!=NULL) {  
            Q.push(node->pLeft);  
        }  
  
        if (node->pRight!=NULL) {  
            Q.push(node->pRight);  
        }  
  
        Q.pop();  
    }  
  
    cout<<endl;  
}