如下圖表示一顆二叉樹,對它進行先序遍歷操作,采用兩種方法,遞歸和非遞歸操作。。
遍歷結果為:1245367。
1、遞歸操作:
思想:若二叉樹為空,返回。否則
1)遍歷根節點;2)先序遍歷左子樹;3)先序遍歷右子樹
代碼:
void PreOrder(BiTree root) { if(root==NULL) return ; printf("%c ", root->data); //輸出數據 PreOrder(root->lchild); //遞歸調用,先序遍歷左子樹 PreOrder(root->rchild); //遞歸調用,先序遍歷右子樹 }
2、非遞歸操作
思想:二叉樹的非遞歸先序遍歷,先序遍歷思想:先讓根進棧,只要棧不為空,就可以做彈出操作, 每次彈出一個結點,記得把它的左右結點都進棧,記得右子樹先進棧,這樣可以保證右子樹在棧中總處於左子樹的下面。
代碼:
void PreOrder_Nonrecursive(BiTree T) //先序遍歷的非遞歸 { if(!T) return ; stack<BiTree> s; s.push(T); while(!s.empty()) { BiTree temp = s.top(); cout<<temp->data<<" "; s.pop(); if(temp->rchild) s.push(temp->rchild); if(temp->lchild) s.push(temp->lchild); } }
或者:
void PreOrder_Nonrecursive(BiTree T) //先序遍歷的非遞歸 { if(!T) return ; stack<BiTree> s; while(T) // 左子樹上的節點全部壓入到棧中 { s.push(T); cout<<T->data<<" "; T = T->lchild; } while(!s.empty()) { BiTree temp = s.top()->rchild; // 棧頂元素的右子樹 s.pop(); // 彈出棧頂元素 while(temp) // 棧頂元素存在右子樹,則對右子樹同樣遍歷到最下方 { cout<<temp->data<<" "; s.push(temp); temp = temp->lchild; } } }