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

首頁 > 編程 > C > 正文

二叉樹先根(先序)遍歷的改進

2020-01-26 15:38:31
字體:
來源:轉載
供稿:網友

二叉樹的特點:每個結點的度最大不能超過2,并且左右子樹不能顛倒

二叉樹的存儲結構:下面采用鏈式存儲進行闡述,堆排序算法(快速排序改進)采用的順序存儲結構的二叉樹,先看如下結構體的存儲方式

順序存儲:

復制代碼 代碼如下:

/*二叉樹的順序存儲*/
#define  MAX_TREE_SIZE 100
typedef  TElemType  SqBiTree[MAX_TREE_SIZE];

鏈式存儲:

復制代碼 代碼如下:

/*二叉樹的鏈式存儲*/
typedef struct BiTNode
{
 TElemType data;
 BiTNode  *lchild,*rchild;
}
BiTNode, *BiTree;

這里的TElemType的類型如下,這里我使用了int型的定義:

復制代碼 代碼如下:

#define INT_TYPE
#ifdef INT_TYPE
typedef int TElemType;
#elif defined FLOAT_TYPE
typedef float TElemType
#elif defined STRING_TYPE
typedef char  *TElemType
#endif

二叉樹的創建:這里需要進行遞歸創建,如下

復制代碼 代碼如下:

int CreateBiTree(BiTree &T)
{
 int nData;

 printf("Please Enter BiTree Node data:/n"); 
 scanf_s("%d", &nData);

 if (nData == 0)
 {
  T = NULL;
  return OK;
 }
 else if (nData > 0 && nData < 100)
 {
  T = (BiTNode*)malloc(sizeof(BiTNode));
  if (!T)
  {
   return BTOVERFLOW;
  }
  T->data = nData;
  CreateBiTree(T->lchild);
  CreateBiTree(T->rchild);
  return OK;
 }
#ifdef _DEBUG
 printf("Enter data Error!/n");
#endif // _DEBUG

 return ERROR;
}

這里我對數據進行了限制,便于進行測試,這里只接受0~100的數據,如果是0表明當前沒有孩子的節點(左孩子或者右孩子),如果存在就創建節點,填充數據
遍歷二叉樹:創建后之后,我必須測試創建的二叉樹中的數據是否正確,這里采用的是先根遍歷,如下

復制代碼 代碼如下:

/*遍歷二叉樹*/
int PreOrderTraverse(BiTree T, int (*VisitNode)(TElemType))
{
 if (T)
 {
  if (VisitNode(T->data))
  {
   if (PreOrderTraverse(T->lchild, VisitNode))
   {
    if (PreOrderTraverse(T->rchild, VisitNode))
    {
     return OK;
    }
   }
  }
  return ERROR;
 }
 return OK; //如果沒有子孩子,這時候應該回溯,要查看右孩子必須為真
}

這里遍歷的時候采用了一個函數,注意傳遞的形參是函數指針,只是進行簡單的結點數據的輸出,如下:

復制代碼 代碼如下:

int VisitNode(TElemType data)
{
#if defined(INT_TYPE) || defined(FLOAT_TYPE)
 printf("%d ", data);
#elif defined(STRING_TYPE)
 printf("%s ", data);
#endif
 return OK;
}

但是在遍歷的時候,為什么T為NULL的時候,返回還是OK(1)呢,這里主要是上面的遍歷函數的原因,因為這里必須是先遍歷左孩子且返回值為真,才能遍歷右孩子,所以不能返回ERROR(0),感覺返回值有點怪,修改如下

復制代碼 代碼如下:

int PreOrderTraverseEx(BiTree T, int (*VisitNode)(TElemType))
{
 if (T)
 {
  if (VisitNode(T->data))
  {
   PreOrderTraverse(T->lchild, VisitNode);
   PreOrderTraverse(T->rchild, VisitNode);
   return OK;
  }
 }
 return ERROR; //如果沒有子孩子,這時候應該回溯
}

這樣看著就舒服多了,其實可以不使用任何返回值,主要遍歷完左右子樹不用做其他任何事情,如果還有其他,就不能沒有返回值,這里return OK其實要不要也無所謂,因為我根本沒有進行判斷
測試用例:如下

復制代碼 代碼如下:

 BiTree T;
 if (CreateBiTree(T))
 {
  PreOrderTraverseEx(T, VisitNode);
  printf("/n");
 }

這里對測試的數據輸入其實有一定的要求,假設根為12 孩子結點為 34 78,這里應該這樣輸入數據 12 34 0 0 78 0 0,只有這樣才能正常退出,如下測試結果:
Please Enter BiTree Node data:
12
Please Enter BiTree Node data:
34
Please Enter BiTree Node data:
0
Please Enter BiTree Node data:
0
Please Enter BiTree Node data:
78
Please Enter BiTree Node data:
0
Please Enter BiTree Node data:
0
12 34 78

從前面我可以看到這里采用的其實都是遞歸算法,我們都知道遞歸最大之弊病就是在每次下潛下一層的時候,一定要保存當前所在層次的數據,具體哪些數據其實是由操作系統OS來進行管理的,但是像每次的形參T一定會入棧,便于在層次退出返回上一層的時候使用,所以這里就可以采用非遞歸的方式的來進行修改算法:如何做呢?

請參考二叉樹先序遍歷的非遞歸算法

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人拍精品视频午夜网站| 欧美刺激性大交免费视频| 欧美另类99xxxxx| 日韩在线播放av| 久久精品国产一区二区三区| 4388成人网| 成人在线观看视频网站| 亚洲成人a级网| 性色av一区二区三区红粉影视| 欧美理论电影在线播放| 亚洲国产91精品在线观看| 亚洲qvod图片区电影| 欧美精品电影在线| 欧美性xxxx极品hd欧美风情| 久久伊人精品天天| 欧美一级免费看| 欧美激情乱人伦| 国产日韩欧美中文在线播放| 久久久久久国产精品美女| 国产精品九九久久久久久久| 国产主播精品在线| 欧日韩在线观看| 久久久午夜视频| 最近中文字幕mv在线一区二区三区四区| 国产精品999| 3344国产精品免费看| 国产成人一区二区三区| 国产精品国语对白| 国产日韩综合一区二区性色av| 国产一区二区三区18| 精品伊人久久97| 亚洲第一色在线| 亚洲在线观看视频网站| 久久激情视频免费观看| 久久国产精品久久久久| 欧美精品情趣视频| 亚洲成人网在线观看| 欧美自拍视频在线观看| 国产精品一区二区3区| 国内揄拍国内精品少妇国语| 国产精品男人的天堂| 日韩av网站导航| 亚洲护士老师的毛茸茸最新章节| 亚洲精品一区久久久久久| 成人a视频在线观看| 亚洲国产精品va在线观看黑人| 中文字幕欧美精品日韩中文字幕| 欧美国产高跟鞋裸体秀xxxhd| 欧美人交a欧美精品| 国产日韩欧美在线观看| 久久男人的天堂| 日韩av网站大全| 亚洲精品av在线| 国产欧美久久久久久| 欧美激情videoshd| 久久成人精品一区二区三区| 一区二区在线视频播放| 亚洲精品aⅴ中文字幕乱码| 亚洲成人三级在线| 成人信息集中地欧美| 欧美精品一本久久男人的天堂| 69影院欧美专区视频| 久久精品国产91精品亚洲| 日韩欧美国产免费播放| 久久这里有精品视频| 91牛牛免费视频| 午夜精品福利电影| 欧美床上激情在线观看| 8x拔播拔播x8国产精品| 日韩av理论片| 97精品视频在线| 亚洲国产精品va在线| 久久视频国产精品免费视频在线| 中文字幕在线亚洲| 成人免费xxxxx在线观看| 国产精品视频一区二区三区四| 国产成人在线一区| 亚洲美女中文字幕| 久久影视电视剧免费网站清宫辞电视| 亚洲一区精品电影| 国产高清在线不卡| 久久久精品电影| 亚洲自拍偷拍福利| 午夜精品久久久久久久99黑人| 欧美超级乱淫片喷水| 国内自拍欧美激情| 一区二区三区在线播放欧美| 91欧美视频网站| 日韩欧美精品网站| 欧美日韩激情视频8区| 91国产在线精品| 欧美国产日韩一区二区在线观看| 色偷偷综合社区| 精品人伦一区二区三区蜜桃网站| 国产精品视频yy9099| 韩剧1988在线观看免费完整版| 日韩av免费在线| 成人精品网站在线观看| 国产成人jvid在线播放| 国产成人精品电影久久久| 欧美精品xxx| 久久久免费av| 亚洲一区二区免费在线| 91免费看视频.| 亚洲福利在线视频| 久久最新资源网| 欧美日韩在线另类| 奇米四色中文综合久久| 日本亚洲欧美成人| 国产精品爽黄69天堂a| 曰本色欧美视频在线| 亚洲欧美资源在线| 美女国内精品自产拍在线播放| 欧美精品福利视频| 成人h猎奇视频网站| 丁香五六月婷婷久久激情| 欧美亚洲在线播放| 日韩精品中文字幕视频在线| 国产成人久久精品| 草民午夜欧美限制a级福利片| 久久国产精品亚洲| 欧美野外猛男的大粗鳮| 精品久久久久久中文字幕一区奶水| 国产精品视频免费在线| 懂色av影视一区二区三区| 国产成人一区二区三区| 欧美大全免费观看电视剧大泉洋| 国产日韩精品综合网站| 欧美国产精品va在线观看| 一区二区三区天堂av| 成人免费午夜电影| 欧美视频精品一区| 一区二区三区久久精品| 日韩经典中文字幕在线观看| 国产精品国产三级国产aⅴ浪潮| 亚洲精品资源美女情侣酒店| 国产精品日日摸夜夜添夜夜av| 亚洲精品国产拍免费91在线| 91牛牛免费视频| 国产亚洲免费的视频看| 日本午夜精品理论片a级appf发布| 久久久久久久激情视频| 亚洲高清免费观看高清完整版| 欧美资源在线观看| 性欧美暴力猛交69hd| 国产主播欧美精品| 中文字幕av一区中文字幕天堂| 91精品国产乱码久久久久久久久| 久久躁日日躁aaaaxxxx| 欧美日韩成人黄色| 成人精品视频在线| 亚洲三级av在线| 欧日韩在线观看| 91亚洲精品久久久| 日本一本a高清免费不卡| 国产91精品黑色丝袜高跟鞋| 欧美激情精品久久久久久免费印度| 国产精品亚洲片夜色在线| 欧美日韩午夜激情| 国产精品久久久久久久av电影| 久久国产精品免费视频| 国a精品视频大全| 成人黄色午夜影院| 亚洲欧美日韩直播|