二叉树先中后序递归遍历与非递归遍历、层次遍历
生活随笔
收集整理的這篇文章主要介紹了
二叉树先中后序递归遍历与非递归遍历、层次遍历
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1 先序遍歷
- 1.1 先序遍歷遞歸
- 1.2 先序遍歷非遞歸
- 2 中序遍歷
- 2.1 中序遍歷遞歸
- 2.2 中序遍歷非遞歸
- 3 后序遍歷
- 3.1 后序遍歷遞歸
- 3.2 后序遍歷非遞歸
- 4 層序遍歷
1 先序遍歷
若二叉樹為空,則操作返回,否則先訪問根結點,然后前序遍歷左子樹,再前序遍歷右子樹
1.1 先序遍歷遞歸
void PreviousOrderTraverse(BTNode T) {if (T == NULL) {return;}/* 對節(jié)點的操作 */PreviousOrderTraverse(T->lchild); // 先序遍歷左子樹PreviousOrderTraverse(T->rchild); // 再先序遍歷右子樹 }1.2 先序遍歷非遞歸
遞歸的實現(xiàn)依賴于棧,那么就將二叉樹的遞歸遍歷轉換為非遞歸遍歷,也就是利用棧來實現(xiàn)
void PreviousOrderTraverse(BTNode *bt) {if(bt !=NULL){BTNode *Stack[maxSize]; int top=-1;BTNode *p=NULL; //p為遍歷指針Stack[++top]=bt;while(top!=-1){p=Stack[top--]; //根結點出棧并訪問visit(p);if(p->rchild!=NULL)//檢測左右孩子是否存在Stack[++top]=p->rchild; //先入if(p->rchild!=NULL)Stack[++top]=p->lchild;}} }2 中序遍歷
若二叉樹為空,則操作返回,否則從根節(jié)點開始(注意不是先訪問根結點),中序遍歷根結點的左子樹,然后是訪問根結點,最后中序遍歷右子樹
2.1 中序遍歷遞歸
void InOrderTraverse(BTNode T) {if (T == NULL) {return;}InOrderTraverse(T->lchild); // 先中序遍歷左子樹/* 對結點的操作 */InOrderTraverse(T->rchild); // 再中序遍歷右子樹 }2.2 中序遍歷非遞歸
void InOrderTraverse(BTNode *bt) {BTNode p = T; // p 是遍歷指針Stack S = CreateStack(MAXSIZE); // 初始化棧while (p != NULL || !IsEmpty(S)) { // 棧不為空或 p 不為空時遍歷if (p != NULL) {Push(S, p); // 一直向左并將沿途節(jié)點壓入堆棧p= p->leftChild;} else { // p 為空時,棧不為空,彈出節(jié)點訪問右孩子p= Pop(S); // 彈出堆棧visit();//訪問節(jié)點p = p->rightChild;}} }3 后序遍歷
若二叉樹為空,則操作返回,否則從左到右,先葉子后結點的方式遍歷訪問左右子樹,最后是訪問根結點
3.1 后序遍歷遞歸
void PostOrderTraverse(BTNode T) {if (T == NULL) {return;}PostOrderTraverse(T->lchild); // 先后序遍歷左子樹PostOrderTraverse(T->rchild); // 再后序遍歷右子樹/* 對結點的操作 */ }3.2 后序遍歷非遞歸
4 層序遍歷
若二叉樹為空,則操作返回,否則從樹的第一層,也就是根結點開始訪問,從上而下逐層遍歷,在同一層中,按從左到右的順序對結點逐個訪問
總結
以上是生活随笔為你收集整理的二叉树先中后序递归遍历与非递归遍历、层次遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PNAS新研究:剑桥学者发现,有些 AI
- 下一篇: tensorflow3 非线性回归、mn