中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言線索二叉樹的前中后如何創建和遍歷

發布時間:2022-02-21 13:40:45 來源:億速云 閱讀:158 作者:iii 欄目:開發技術

這篇“C語言線索二叉樹的前中后如何創建和遍歷”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C語言線索二叉樹的前中后如何創建和遍歷”文章吧。

    1.結構

    #include<stdio.h>
    #include<stdlib.h>
    #define false 0
    #define true 1
    using namespace std;
    typedef struct BTnode{
     	int data;
     	struct BTnode *lchild,*rchild;
     	int ltag,rtag;
     }*BTree,BTnode;

    1.1初始化tag

    #include<stdio.h>
    #include<stdlib.h>
    #define false 0
    #define true 1
    using namespace std;
    typedef struct BTnode{
     	int data;
     	struct BTnode *lchild,*rchild;
     	int ltag,rtag;
     }*BTree,BTnode;

    2.基本操作

    2.1 先序創建二叉樹

    int j=0;  //創建二叉樹的全局變量 
     //先序創建二叉樹
     int CreateBTree(BTree &T){
     	int str[]={1,2,3,NULL,4,NULL,NULL,NULL,5,6,NULL,7,NULL,NULL,8,NULL,NULL};
     	if(str[j]=='#') return false;
     	if(str[j]==NULL){
     		T=NULL;
     		j++;
    	 }else{
    	 	T=(BTnode *)malloc(sizeof(BTnode));
    	 	T->data=str[j];
    	 	j++;
    	 	CreateBTree(T->lchild);
    	 	CreateBTree(T->rchild);
    	 }
     }

    輸出函數:

    inline bool visit(int e){   //此處使用內斂函數,提高運行效率 
     	printf("%d",e);
     	return true;
     }

    2.2.先序線索化

    //先序線索化.
     void prehread(BTree &root){
    	if(root!=NULL){
    		if(root->lchild==NULL){
    			root->ltag=1;
    			root->lchild=pre;
    		}else{
    			root->ltag=0;
    		}
    		if(pre){
    			if(pre->rchild==NULL){
    				pre->rtag=1;
    				pre->rchild=root;
    			}else{
    				pre->rtag=0;
    			}
    		}
    		pre=root;
    		if(root->ltag==0){
    		prehread(root->lchild);	
    		}
    		if(root->rtag==0){
    			prehread(root->rchild);
    		}
    	}
    }
    2.2.1.先序遍歷
    //尋找先序后繼 
    BTree preNext(BTree T){
     	if(T->rtag==1){
    		return T->rchild;
    	 }else{
    	 	if(T->ltag==0){
    	 		return T->lchild;
    		 }else{
    		 	return T->rchild;
    		 }
    	 }
    	 }
    //先序線索二叉樹的遍歷
    void prebianli(BTree T){
    	BTree p;
    	p=T;
    	while(p){
    		visit(p->data);
    		p=preNext(p);
    	}
    }

    C語言線索二叉樹的前中后如何創建和遍歷

    2.3.中序線索化

    //中序線索化
    BTree pre=NULL ;  //中序線索化的全局變量 
    void Inthread(BTree &root){
    	if(root!=NULL){
    		Inthread(root->lchild);
    		if(root->lchild==NULL){
    			root->ltag=1;
    			root->lchild=pre;
    		}else{
    			root->ltag=0;
    		}
    		if(pre){
    			if(pre->rchild==NULL){
    				pre->rtag=1;
    				pre->rchild=root;
    			}else{
    				pre->rtag=0;
    			}
    		}
    		pre=root;
    		Inthread(root->rchild);
    	}
    }
    2.3.1 中序遍歷
    //求中序首結點 
    BTree InFirst(BTree T){
    	BTree p=T;
    	if(p==NULL) return NULL;
    	while(p->ltag==0){
    		p=p->lchild; 
    	}
    	return p;
    } 
    //求中序后繼
     BTree InNext(BTree T) {
     	BTree next=NULL;
     	if(T->rtag==1){
     		next=T->rchild;
    	 }else {
    		T = T->rchild;
    		while (T->ltag==0 ) {
    			T = T->lchild;
    		}
    		next=T;
    	 }
    	 return next;
     }
     //中序線索二叉樹的遍歷
    void Inbianli(BTree T){
    	BTree p;
    	p=InFirst(T);
    	while(p){
    		visit(p->data);
    		p=InNext(p);
    	}
    }

    C語言線索二叉樹的前中后如何創建和遍歷

    2.4.后序線索化

    //后續線索化
      void Postthread(BTree &root){
    	BTree pre=NULL;
    	if(root){
    		Postthread(root->lchild);
    		Postthread(root->rchild);
    		if(root->lchild==NULL){
    			root->ltag=1;
    			root->lchild=pre;
    		}
    		if(pre&&pre->rchild==NULL){
    			pre->rtag=1;
    			pre->rchild=root;
    		}
    		pre=root;
    		}
    }
    2.4.1 后序遍歷
    //求后序前驅 
    BTree postnext(BTree T){
    	if(T->ltag==0){
    		if(T->rtag==0){
    			return T->rchild;
    		}else{
    			return T->lchild;
    		}
    	}else {
    		return T->lchild;
    	}
    }
    //后序遍歷
    void postbianli(BTree T){
    	BTree p;
    	p=T;
    	while(p){
    		p=postnext(p);
    		visit(p->data);
    	}
    }

    C語言線索二叉樹的前中后如何創建和遍歷

    以上就是關于“C語言線索二叉樹的前中后如何創建和遍歷”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    抚远县| 修文县| 桃源县| 怀仁县| 禹城市| 泰安市| 安远县| 莱阳市| 泸溪县| 当涂县| 永嘉县| 河北区| 越西县| 虹口区| 丰原市| 丹棱县| 黔东| 化州市| 松江区| 通江县| 临安市| 丹巴县| 亚东县| 台东县| 满洲里市| 保山市| 崇州市| 黄平县| 壤塘县| 衡东县| 竹溪县| 菏泽市| 县级市| 承德县| 密云县| 玉龙| 肇庆市| 牙克石市| 吴忠市| 易门县| 东至县|