国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 二叉樹先根(先序)遍歷的改進

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

2021-01-13 15:25C語言教程網 C/C++

這篇文章主要介紹了二叉樹先根(先序)遍歷的改進,有需要的朋友可以參考一下

二叉樹的特點:每個結點的度最大不能超過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一定會入棧,便于在層次退出返回上一層的時候使用,所以這里就可以采用非遞歸的方式的來進行修改算法:如何做呢?

延伸 · 閱讀

精彩推薦
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
主站蜘蛛池模板: 午夜在线电影 | 狠狠操av | 一区二区三区久久久 | 影音先锋中文字幕一区 | 人人澡人人射 | 欧美一区二区免费 | 在线观看国产视频 | 免费国产一区 | 天堂中文网 | 日韩欧美在线观看 | 欧美视频免费在线 | 免费福利网站 | 欧美日韩一二区 | 成人精品在线 | 欧美日韩视频一区二区 | 国产一区不卡视频 | 国产一区二区久久久 | 日韩毛片一区二区三区 | 国产视频9999 | 黄色片网站在线 | 91网页版 | 午夜伦理影院 | 91高清在线| 午夜免费电影 | 一区二区三区精品 | 成人精品鲁一区一区二区 | 亚洲视频中文字幕 | 明里在线观看 | 黄色片网站在线免费观看 | 色图自拍偷拍 | 午夜社区 | 九九九久久国产免费 | 亚洲一区二区国产 | 一区二区三区中文字幕 | 久久草视频 | 久久久一二三 | 国产亚洲片 | 羞羞羞网站 | av免费资源 | 婷婷精品久久久久久久久久不卡 | 中文字幕在线综合 |