1. 程式人生 > >BST/二叉樹層序遍歷

BST/二叉樹層序遍歷

利用佇列的FIFO特性來實現層序遍歷。

初始化:建立佇列q,root入隊。

只要佇列不為空:存隊首元素,把隊首元素pop出來,列印隊首元素。判斷它是否有左孩子,如果有,則左孩子入隊;判斷是否有右孩子,如果有,則右孩子入隊(先判斷左孩子再右孩子是因為這裡一層中遍歷假定從左到右)。

有點像利用棧的前序遍歷,但是棧是LIFO,因此假如要進行前序遍歷,則入棧的時候是先判斷併入右孩子”go” command,再判斷併入左孩子”go” command,最後入當前節點”print” command。

而且,只要佇列不為空,每一次取出來隊首元素一定會先列印,這就是層序遍歷;而在棧不為空的時候,每一次取出棧頂元素要先判斷當前命令是否是”print”,只有print的時候才打印,否則是”go”,就是繼續向下深度遍歷,之後依次彈出這一趟遍歷的元素的command,再進行判斷。

struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
};

void levelTraversal(TreeNode* root){

    if(root == NULL)//處理root為空的情況
        return;

    queue<TreeNode*> q;//注意這裡是TreeNode*型別不是int
    q.push(root);//佇列初始化完成

    while(!q.empty()){//當佇列不為空
        TreeNode* node = q.front();
        q.pop();

        cout
<<node->val;//列印當前節點 if(node->left)//左孩子不為空則入隊 q.push(node->left); if(node->right)//右孩子不為空則入隊 q.push(node->right); } }