亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

二叉樹的字符串創建和遍歷,求深度,葉子節點數

2019-11-11 04:12:15
字體:
來源:轉載
供稿:網友

第一:寫自己的頭文件”BTree.h“

#ifndef _B_TREE_H_#define _B_TREE_H_#define LEFT_CHILD		1   //左孩子#define RIGHT_CHILD		2   //右孩子typedef struct BTREE{	NODE_TYPE value;	struct BTREE *leftChild;	struct BTREE *rightChild;}BTREE;#endif

第二: 通過字符串 a(b,c)輸入二叉樹

首先我們將錄入的字符串分為以下六種狀態://定義字符串的六種狀態#define BTREE_STATUS_BEGIN 1 //開始#define BTREE_STATUS_END 2 //結束#define BTREE_STATUS_ALPHA 3//字符#define BTREE_STATUS_LEFT_BRACKET 4//左括號#define BTREE_STATUS_RIGHT_BRACKET 5//右括號#define BTREE_STATUS_COMMA 6//逗號剛開始為開始狀態,然后根據狀態進行轉換。
#include<stdio.h>#include<malloc.h>#include<string.h>#include"MecTool.h"typedef char NODE_TYPE;#include"BTree.h"typedef BTREE *USER_TYPE;#include"MecStack.h"//定義字符串的六種狀態#define BTREE_STATUS_BEGIN				1 //開始#define BTREE_STATUS_END				2 //結束#define BTREE_STATUS_ALPHA				3	//字符#define BTREE_STATUS_LEFT_BRACKET		4	//左括號#define BTREE_STATUS_RIGHT_BRACKET		5	//右括號#define BTREE_STATUS_COMMA				6	//逗號//將需要用到的變量封裝起來typedef struct{	int status;   //狀態	boolean Ok; //是否正確	boolean finished; //是否	int index; //處理的字符位置	int whichChild; //處理的哪一個孩子;	BTREE *root; //指向的二叉樹	BTREE *node;  //指向新生成的節點	MEC_STACK *nodePointStack; //指向棧}BTREE_PARA;boolean PRocessBtreeComma(char ch, BTREE_PARA *para){	if(isalpha(ch)){		dealAlpha(ch, para);		para->index++;		para->status = BTREE_STATUS_ALPHA;	}else if(')' == ch){		dealRightBracket(para);		para->index++;		para->status = BTREE_STATUS_RIGHT_BRACKET;	}else{		para->Ok = FALSE;	}	return para->Ok;}boolean processBtreeRightBracket(char ch, BTREE_PARA *para){	if(',' == ch){		dealComma(para);		para->index++;		para->status = BTREE_STATUS_COMMA;	}else if(')' == ch){		if(FALSE == dealRightBracket(para)){			return para->Ok;		}		para->index++;		para->status = BTREE_STATUS_RIGHT_BRACKET;		printf("zheli:%d/n",para->Ok);	}else if(0 == ch){		para->status = BTREE_STATUS_END;	}else		printf("輸出錯誤!/n");	return para->Ok;}boolean processBtreeLeftBracket(char ch, BTREE_PARA *para){	if(isalpha(ch)){		dealAlpha(ch, para);		para->index++;		para->status = BTREE_STATUS_ALPHA;	}else if(',' == ch){		dealComma(para);		para->index++;		para->status = BTREE_STATUS_COMMA;	}else 		printf("輸出錯誤!/n");	return para->Ok;}/*	字符狀態表示我已經處理完了這個字符,看看需要變成什么狀態*/boolean processBtreeAlpha(char ch, BTREE_PARA *para){	if('(' == ch){		if(FALSE ==dealLeftBracket(para)){			return para->Ok;		}		para->index++;		para->status = BTREE_STATUS_LEFT_BRACKET;	}else if(')' == ch){		dealRightBracket(para);		para->index++;		para->status = BTREE_STATUS_RIGHT_BRACKET;	}else if(',' == ch){		dealComma(para);		para->index++;		para->status = BTREE_STATUS_COMMA;	}else if(0 == ch){		para->status = BTREE_STATUS_END;	}else{		printf("輸出錯誤!/n");		para->Ok = FALSE;	}	return para->Ok;}boolean processBtreeEnd(BTREE **pMainRoot, BTREE_PARA *para){	*pMainRoot = para->root;//就是bt指向的空間 == para->root	para->finished = TRUE;	return para->Ok;}boolean processBtreeBegin(char ch, BTREE_PARA *para){	//判斷是不是一個字母	if(isalpha(ch)){		dealAlpha(ch, para);		para->index++;//指向下一個字符		para->status = BTREE_STATUS_ALPHA;//變成字符狀態	}else{		printf("輸入的字符有問題");		return FALSE;	}	return para->Ok;}boolean createBtreeByString(char *str, BTREE **bt){		BTREE_PARA para ={		 BTREE_STATUS_BEGIN,		 TRUE,		 FALSE,		 0,		 LEFT_CHILD,		 *bt,		NULL,		NULL,	};	if(para.root != NULL){		printf("二叉樹存在");		return FALSE;	}	//初始化棧,需要兩個參數,一個是指向棧的指針的地址值,還有申請空間。	initMecStack(?.nodePointStack, strlen(str) / 2);	//分狀態處理字符串	while(para.Ok && !para.finished){		para.index = skipBlank(str, para.index); //跳過空白		if(BTREE_STATUS_BEGIN == para.status){			processBtreeBegin(str[para.index], ?);		}else if(BTREE_STATUS_END == para.status){			processBtreeEnd(bt, ?);		}else if(BTREE_STATUS_ALPHA == para.status){			processBtreeAlpha(str[para.index], ?);		}else if(BTREE_STATUS_LEFT_BRACKET == para.status){			processBtreeLeftBracket(str[para.index], ?);		}else if(BTREE_STATUS_RIGHT_BRACKET == para.status){			processBtreeRightBracket(str[para.index], ?);		}else if(BTREE_STATUS_COMMA == para.status){			processBtreeComma(str[para.index], ?);		}	}	return para.Ok;}void main(){	char str[80] = {0};	BTREE *btree = NULL;	BTREE *btreeCopy = NULL;	int depth = 0;	int count = 0;	printf("請輸入一個二叉樹A(B,C):");	gets(str);	if(TRUE == createBtreeByString(str, &btree))		printf("表達式正常!/n");	printf("先序遍歷是");	showFirstTree(btree);	printf("/n");	printf("中序遍歷是");	showMiddleTree(btree);	printf("/n");	printf("后序遍歷是");	showAfterTree(btree);	printf("/n");	depth = getTreeDepth(btree);	printf("樹的深度是:%d", depth);	printf("/n");	getTreeCount(btree, &count);	printf("樹的葉子節點個數是:%d", count);	printf("/n");	btreeCopy = copyTree(btree);	printf("先序遍歷是");	showFirstTree(btreeCopy);}處理字符:將字符存儲起來,通過讀取棧頂元素將其鏈接它的雙親節點上。

boolean dealAlpha(char ch, BTREE_PARA *para){	BTREE *parent = NULL;//存放棧頂元素		para->node = (BTREE *)calloc(sizeof(BTREE), 1);	para->node->value = ch;	if(NULL == para->root)//是第一個節點	{		para->root = para->node;	}else{		if(readTop(*para->nodePointStack, &parent) == FALSE){			printf("讀取棧頂元素失敗");			para->Ok = FALSE;			return para->Ok;		}		if(LEFT_CHILD == para->whichChild){			parent->leftChild = para->node;		}else{			parent->rightChild = para->node;		}	}	return para->Ok;}處理右括號,只需要將根節點出棧即可(棧中存儲的都是有孩子且沒有輸入的節點)

boolean dealRightBracket(BTREE_PARA *para){	BTREE* value;	pop(para->nodePointStack, &value);//根節點出棧	return para->Ok;}處理左括號,碰見左括號證明左括號前面的字符是一個雙親節點且子節點沒有錄入,要把這個字符入棧。

boolean dealLeftBracket(BTREE_PARA *para){	//根節點入棧	push(para->nodePointStack,para->node);	//下一個字母是左子樹	para->whichChild = LEFT_CHILD;	return para->Ok;}處理逗號,都要證明下一個字符是右孩子

boolean dealComma(BTREE_PARA *para){	//下一個將要連接右孩子	para->whichChild = RIGHT_CHILD;	return para->Ok;}上面的函數可以實現從鍵盤輸入類似于A(B,C)的字符創建二叉樹的功能

二叉樹的常見遍歷操作

1 遍歷操作:

每個節點都會被左三次,此時不同的就是輸出時刻。

先序遍歷:根節點先輸出
void showFirstTree(BTREE *root){	if(root == NULL)		return;	printf("%c /t", root->value);	showFirstTree(root->leftChild);	showFirstTree(root->rightChild);
中序遍歷:根節點先輸出
void showMiddleTree(BTREE *root){	if(root == NULL)		return;	showMiddleTree(root->leftChild);	printf("%c /t", root->value);	showMiddleTree(root->rightChild);}后序遍歷:根節點最后輸出
void showAfterTree(BTREE *root){	if(root == NULL)		return;	showAfterTree(root->leftChild);	showAfterTree(root->rightChild);	printf("%c /t", root->value);}}

2 求二叉樹的深度

二叉樹的深度 等于左子樹和右子樹其中較大的一個加上1使用遞歸
int getTreeDepth(BTREE *root){	int depth = 0;	int depthLeft = 0;	int depthRight = 0;	if(root == NULL){		return depth;//葉子節點,它的高度是0	}else{		depthLeft = getTreeDepth(root->leftChild);//得到非葉子節點左子樹高度		depthRight = getTreeDepth(root->rightChild);//得到非葉子節點右子樹高度		depth = ((depthLeft > depthRight)? depthLeft :depthRight) + 1;	}	return depth;}

3 復制一個二叉樹

BTREE* copyTree(BTREE *root){	BTREE *p = NULL;//指向這個將要生成的節點	BTREE *leftLink = NULL;//指向將要生成節點的左孩子	BTREE *rightLink = NULL;//右孩子	if(root == NULL)		return;	if(root->leftChild != NULL)//這個要復制的節點的左孩子不是空	{		leftLink = copyTree(root->leftChild);//復制這個左孩子	}else		leftLink = NULL;	if(root->rightChild != NULL)//這個要復制的節點的左孩子不是空	{		rightLink = copyTree(root->rightChild);//復制這個左孩子	}else		rightLink = NULL;	//為新生成的節點申請空間	if((p = (BTREE *)calloc(sizeof(BTREE), 1)) == NULL){		printf("申請空間失敗");	}	p->leftChild = leftLink;	p->rightChild = rightLink;	p->value = root->value;	return p;}

3 求葉子節點數

void getTreeCount(BTREE *root, int *pcount){	if(root == NULL){		return;	}	if(root->leftChild == NULL && root->rightChild == NULL){		(*pcount)++;	}//葉子節點的左孩子和右孩子都是空	getTreeCount(root->leftChild, pcount);	getTreeCount(root->rightChild, pcount);}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲色在线视频| 57pao成人国产永久免费| 成人免费直播live| 日韩欧美在线视频观看| 亚洲综合成人婷婷小说| 久久久精品2019中文字幕神马| 亚洲欧洲午夜一线一品| 欧美久久精品一级黑人c片| 国产精品一区二区电影| 98午夜经典影视| 久久久久久久成人| 日韩美女视频在线观看| 日韩欧美国产高清91| 伊人久久久久久久久久| 日韩在线观看电影| 亚洲图片欧美日产| 日韩av不卡在线| 最近2019中文免费高清视频观看www99| 亚洲视频电影图片偷拍一区| 国产精品久久久久久久久久尿| 亚洲一区二区三区成人在线视频精品| 国产精品久久久久久中文字| 成人免费在线视频网址| 成人h视频在线观看播放| 欧美激情综合色综合啪啪五月| 亚洲精品国产精品乱码不99按摩| 亚洲色图13p| 色伦专区97中文字幕| 中日韩午夜理伦电影免费| 少妇精69xxtheporn| 在线日韩第一页| 国产精品永久在线| 精品久久久香蕉免费精品视频| 亚洲人精品午夜在线观看| 久久精品影视伊人网| 欧美电影在线播放| 日韩欧美成人免费视频| 一道本无吗dⅴd在线播放一区| 日韩在线观看你懂的| 欧美日韩亚洲精品一区二区三区| 色综合久久88色综合天天看泰| 国产精品久久久久久久久久东京| 成人欧美在线观看| 国产在线观看一区二区三区| 亚洲aaaaaa| 国产性色av一区二区| 这里精品视频免费| 亚洲午夜av久久乱码| 久久久综合av| 亚洲品质视频自拍网| 亚洲福利在线看| 国产精品对白刺激| 91热精品视频| 国产成人久久精品| 亚洲欧美日韩天堂| 日韩精品视频三区| 国产欧美日韩精品在线观看| 色久欧美在线视频观看| 日韩中文字幕网址| 国产主播在线一区| 色偷偷88888欧美精品久久久| 亚洲精品www| 91成人在线观看国产| 91精品久久久久久综合乱菊| 92看片淫黄大片欧美看国产片| 欧美日本中文字幕| 欧美大片欧美激情性色a∨久久| 国产免费一区视频观看免费| 成人亚洲欧美一区二区三区| 亚洲成人在线视频播放| 国产午夜精品美女视频明星a级| 亚洲成人久久电影| 国产精品欧美久久久| 岛国av一区二区| 国产a∨精品一区二区三区不卡| 91在线视频一区| 成人网址在线观看| 91网站在线看| 亚洲精品久久久久久久久久久久久| 国产丝袜一区二区三区免费视频| 亚洲欧美福利视频| 国产精品成人在线| 色妞久久福利网| 国产精品专区h在线观看| 91地址最新发布| 精品女同一区二区三区在线播放| 亚洲国产精品视频在线观看| 亚洲欧美999| 黄色精品一区二区| 亚洲精品资源美女情侣酒店| 亚洲在线视频观看| 欧美电影免费看| 久久97精品久久久久久久不卡| 亚洲九九九在线观看| 91精品国产综合久久香蕉最新版| 国产精品久久久久久久久久三级| 久久久久www| 亚洲电影免费观看| 国产自产女人91一区在线观看| 成人久久18免费网站图片| 欧美电影院免费观看| 亚洲国产精品久久久久秋霞蜜臀| 欧美亚洲国产日本| 亚洲视频在线免费观看| 91精品国产乱码久久久久久久久| 欧美在线观看日本一区| 国产亚洲精品高潮| 亚洲人在线视频| 亚洲人成在线免费观看| 国产女精品视频网站免费| 国产美女久久久| 91在线国产电影| 668精品在线视频| 91国偷自产一区二区三区的观看方式| 一区二区欧美在线| 成人黄色免费在线观看| 欧美性猛交xxxx免费看| 久久久中精品2020中文| 日本成熟性欧美| 韩剧1988在线观看免费完整版| 亚洲香蕉成人av网站在线观看| 91禁外国网站| 亚洲视频在线观看网站| 欧美精品久久久久久久久久| 中文综合在线观看| 欧美性猛交xxxxx水多| 欧美一级淫片丝袜脚交| 国产精品99久久久久久人| 日韩精品在线观看视频| 欧美国产第一页| 97婷婷涩涩精品一区| 日韩高清中文字幕| 亚洲香蕉成人av网站在线观看| 日韩欧美成人区| 国产丝袜高跟一区| 精品国内产的精品视频在线观看| 午夜美女久久久久爽久久| 国外成人在线直播| 久久全国免费视频| 中文字幕亚洲激情| 国自产精品手机在线观看视频| 8x拔播拔播x8国产精品| 狠狠色香婷婷久久亚洲精品| 亚洲第一二三四五区| 中文字幕av一区二区三区谷原希美| 日韩欧美a级成人黄色| 国产精品久久久久久久久久三级| 另类天堂视频在线观看| 91视频-88av| 亚洲精品久久久久中文字幕欢迎你| 亚洲欧美中文日韩在线| 国产不卡精品视男人的天堂| 亚洲欧美变态国产另类| 国产精品美女久久久久久免费| 成人av在线网址| 国产精品美乳在线观看| 国产午夜精品免费一区二区三区| 亚洲精品wwwww| 国产啪精品视频| 日产日韩在线亚洲欧美| 成人av电影天堂| 久久久视频精品| 久久久国产精彩视频美女艺术照福利| 日韩风俗一区 二区|