二叉树的先序线索化、中序线索化、后序线索化的对比
生活随笔
收集整理的這篇文章主要介紹了
二叉树的先序线索化、中序线索化、后序线索化的对比
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有一點需要注意:在先序遍歷一個節點的左子樹時,需要判斷其ltag的值是否為0,如果為0可以正常遍歷,但是,如果為1就不能進行遍歷。因為ltag的值為1說明該結點的左指針指向的是它的前驅結點而不是左孩子(左孩子其實并不存在),繼續遍歷的話就會陷入“轉圈圈”(前驅結點、該結點、前驅結點、該結點……)
因為在中序遍歷的順序為左孩子、跟結點、右孩子,后序遍歷的順序為左孩子、右孩子、根結點。在遍歷到跟結點時它的左孩子肯定是已經被遍歷過了,不存在上述“轉圈圈”的問題,所以可以正常遍歷。
右指針要么指向右孩子,要么指向該結點的后繼結點,和正常的遍歷順序一樣,所以也不存在上述“轉圈圈”的問題!
一、先序線索化
#include <iostream> using namespace std; //線索二叉樹的結點 typedef struct ThreadNode{int data;struct ThreadNode *lchild,*rchild;int ltag,rtag; }ThreadNode,*ThreadTree;ThreadNode *pre=NULL;void visit(ThreadNode *q){if(q->lchild==NULL){q->lchild=pre;q->ltag=1;}if(pre!=NULL&&pre->rchild==NULL){pre->rchild=q;pre->rtag=1;}pre=q; }void PreThread(ThreadTree T){if(T!=NULL){visit(T);if(T->ltag==0){PreThread(T->lchild);}PreThread(T->rchild);} }void CreatePreThread(ThreadTree T){pre=NULL;if(T!=NULL){PreThread(T);if(pre->rchild==NULL){pre->rtag=1;}} }二、中序線索化
#include <iostream> using namespace std; //線索二叉樹的結點 typedef struct ThreadNode{int data;struct ThreadNode *lchild,*rchild;int ltag,rtag; }ThreadNode,*ThreadTree;ThreadNode *pre=NULL;void visit(ThreadNode *q){if(q->lchild==NULL){q->lchild=pre;q->ltag=1;}if(pre!=NULL&&pre->rchild==NULL){pre->rchild=q;pre->rtag=1;}pre=q; }void InThread(ThreadTree T){if(T!=NULL){InThread(T->lchild);visit(T);InThread(T->rchild);} }void CreateInThread(ThreadTree T){pre=NULL;if(T!=NULL){InThread(T);if(pre->rchild==NULL){pre->rtag=1;}} }三、后序線索化
#include <iostream> using namespace std; //線索二叉樹的結點 typedef struct ThreadNode{int data;struct ThreadNode *lchild,*rchild;int ltag,rtag; }ThreadNode,*ThreadTree;ThreadNode *pre=NULL;void visit(ThreadNode *q){if(q->lchild==NULL){q->lchild=pre;q->ltag=1;}if(pre!=NULL&&pre->rchild==NULL){pre->rchild=q;pre->rtag=1;}pre=q; }void PostThread(ThreadTree T){if(T!=NULL){PostThread(T->lchild);PostThread(T->rchild);visit(T);} }void CreatePostThread(ThreadTree T){pre=NULL;if(T!=NULL){PostThread(T);if(pre->rchild==NULL){pre->rtag=1;}} }?
總結
以上是生活随笔為你收集整理的二叉树的先序线索化、中序线索化、后序线索化的对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二叉树的四种遍历方法:前序、中序、后序、
- 下一篇: 先序序列为a、b、c、d的不同二叉树的个