BST/二叉樹層序遍歷
阿新 • • 發佈:2019-02-18
利用佇列的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);
}
}