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

首頁 > 編程 > C++ > 正文

C++ 遍歷二叉樹實例詳解

2020-01-26 14:06:39
字體:
來源:轉載
供稿:網友

C++ 遍歷二叉樹實例詳解

2叉數又叫紅黑樹,關于2叉數的遍歷問題,有很多,一般有三種常用遍歷方法:

(1)前序遍歷(2)中序遍歷(3)后續遍歷

       以下是經典示例:

#include "stdafx.h"  #include<stdio.h> #include<malloc.h> #include <math.h > #define MaxSize 20  typedef struct BiTNode {  int data;  struct BiTNode *lchild, *rchild; }BiTNode,*BiTree;  //建立二叉樹 void CreateBiTree(BiTree *T) {  char ch;  scanf("%c",&ch);  getchar();  if(ch==' ')  {   printf("不產生子樹。/n");   *T=NULL;  }  else  {   if(!(*T=(BiTNode *)malloc(sizeof(BiTNode))))   {    printf("分配空間失敗");    return;   }//生成一個新節點   (*T)->data = ch;   printf("產生左右子樹。/n");   CreateBiTree(&(*T)->lchild);          CreateBiTree(&(*T)->rchild);         } }  //遞歸前序遍歷 void Preorder(BiTNode *T) {  if(T)  {   printf("%c ",T->data);   Preorder(T->lchild);           Preorder(T->rchild);         } }  //遞歸中序遍歷 void Inorder(BiTNode *T) {  if(T)  {   Inorder(T->lchild);   printf("%c ",T->data);   Inorder(T->rchild);  } }  //遞歸后序遍歷 void Postorder(BiTNode *T) {  if(T)  {   Postorder(T->lchild);   Postorder(T->rchild);   printf("%c ",T->data);  } }  //非遞歸前序遍歷 void NPreorder(BiTNode *T) {  BiTNode *stack[MaxSize],*p;  int top=-1;  if(T)  {   top++;   stack[top]=T;     //根節點進棧   while(top>-1)     //棧不為空時循環   {    p=stack[top];    //退棧并訪問該節點    top--;    printf("%c ",p->data);    if(p->rchild)    //右孩子進棧    {     top++;     stack[top]=p->rchild;    }    if(p->lchild)    //左孩子進棧    {     top++;     stack[top]=p->lchild;    }   }        } }  //非遞歸中序遍歷 void NInorder(BiTNode *T) {  BiTNode *stack[MaxSize],*p;  int top=-1;  p=T;  while(p||top!=-1)  {   if(p)   {    top++;    stack[top]=p;    p=p->lchild;   }        //根節點進棧,遍歷左子樹   else       //根節點退棧,訪問根節點,遍歷右子樹   {    p=stack[top];    top--;    printf("%c ",p->data);    p=p->rchild;   }  } }  //非遞歸后序遍歷 void NPostorder(BiTNode *T) {  BiTNode *stack[MaxSize],*p;  int flag,top=-1;  do  {   while(T)   {    top++;    stack[top]=T;    T=T->lchild;   }        //所有左節點進棧   p=NULL;      //p總是指向當前節點的前一個已經訪問過的節點   flag=1;      //flag為1表示當前節點已經訪問過了   while(top!=-1 && flag)   {    T=stack[top];    if(T->rchild==p)   //右子樹不存在或者已經被訪問過時    {     printf("%c ",T->data);     top--;     p=T;     //調整p指針    }    else    {     T=T->rchild;     flag=0;    //調整訪問標志    }   }  } while(top!=-1); }  //層次遍歷二叉樹 void Translever(BiTNode *T) {  struct node  {   BiTNode *vec[MaxSize];   int f,r;    //r為隊尾,f為隊頭  }queue;  BiTNode *p;  p=T;  queue.f=0;  queue.r=0;  if(T)   printf("%c ", p->data);  queue.vec[queue.r]=p;  queue.r=queue.r+1;  while(queue.f<queue.r)  {   p=queue.vec[queue.f];   queue.f=queue.f+1;   if(p->lchild)   {    printf("%c ",p->lchild->data);    queue.vec[queue.r]=p->lchild;    queue.r=queue.r+1;   }   if(p->rchild)   {    printf("%c ",p->rchild->data);    queue.vec[queue.r]=p->rchild;    queue.r=queue.r+1;   }  }  printf("/n"); }  //求二叉樹的深度 int Depth(BiTNode *T) {  int dep1,dep2;  if(T==NULL)   return(0);  else  {   dep1=Depth(T->lchild);   dep2=Depth(T->rchild);   if(dep1>dep2)    return(dep1+1);   else    return(dep2+1);  } }  //輸出二叉樹 void Disptree(BiTNode *T) {  if(T)  {   printf("%c",T->data);   if(T->lchild || T->rchild)   {    printf("(");    Disptree(T->lchild);    if(T->rchild)     printf(",");    Disptree(T->rchild);    printf(")");   }  } } 

main.cpp

void main() {  BiTree T=NULL;  char j;  int sign = 1;   printf("本程序可以進行建立二叉樹、遞歸與非遞歸先序、中序、后序遍歷二叉樹、層次遍歷二叉樹、輸出二叉樹的擴展序列的操作。/n");  printf("請將二叉樹的先序序列輸入以建立二叉樹,葉子節點用空格代替。/n");  printf("您必須一個一個地輸入字符。/n");  while(sign)  {   printf("請選擇: /n");   printf("0.生成二叉樹         1.求二叉樹的深度/n");   printf("2.遞歸先序遍歷        3.非遞歸先序遍歷/n");   printf("4.遞歸中序遍歷        5.非遞歸中序遍歷/n");   printf("6.遞歸后序遍歷        7.非遞歸后序遍歷/n");   printf("8.層次遍歷         9.輸出二叉樹的廣義表形式/n");   printf("q.退出程序/n");   scanf("%c",&j);   getchar();   switch(j)   {   case '0':    printf("生成二叉樹:");    CreateBiTree(&T);    printf("/n");    printf("/n");    break;   case '1':    if(T)    {     printf("此二叉樹的深度為:");     printf("%d",Depth(T));     printf("/n");     printf("/n");    }    else printf("二叉樹為空!/n");    break;   case '2':    if(T)    {     printf("遞歸先序遍歷二叉樹:");     Preorder(T);     printf("/n");     printf("/n");    }    else     printf("二叉樹為空!/n");    break;   case '3':    if(T)    {     printf("非遞歸先序遍歷二叉樹:");     NPreorder(T);     printf("/n");     printf("/n");    }    else     printf("二叉樹為空!/n");    break;   case '4':    if(T)    {     printf("遞歸中序遍歷二叉樹:");     Inorder(T);     printf("/n");     printf("/n");    }    else printf("二叉樹為空!/n");    break;   case '5':    if(T)    {     printf("非遞歸中序遍歷二叉樹:");     NInorder(T);     printf("/n");     printf("/n");    }    else printf("二叉樹為空!/n");    break;   case '6':    if(T)    {     printf("遞歸后序遍歷二叉樹:");     Postorder(T);     printf("/n");     printf("/n");    }    else printf("二叉樹為空!/n");    break;   case '7':    if(T)    {     printf("非遞歸后序遍歷二叉樹:");     NPostorder(T);     printf("/n");     printf("/n");    }    else printf("二叉樹為空!/n");    break;   case '8':    if(T)    {     printf("層次遍歷二叉樹:");     Translever(T);     printf("/n");     printf("/n");    }    else printf("二叉樹為空!/n");    break;   case '9':    if(T)    {     printf("輸出二叉樹:");     Disptree(T);     printf("/n");     printf("/n");    }    else printf("二叉樹為空!/n");    break;   default:    sign=0;    printf("程序運行結束,按任意鍵退出!/n");   }  } } 

示例:

轉換成雙向鏈表

先序列:H      F       C       D      M     I        N
中序列:C       F       D      H      I        M     N
后序列:C       D      F       I        N      M     H 

#include <iostream> using namespace std; struct BSTreeNode{  char m_val;  BSTreeNode *m_pLeft;  BSTreeNode *m_pRight; }; BSTreeNode *pHead;//鏈表顯示的頭結點 BSTreeNode *pListIndex;//游標指針 void showOrderLiust(BSTreeNode *pCurrent); void createBSTree(BSTreeNode *&pCurrent,char ch) {  if (NULL == pCurrent) {  pCurrent = new BSTreeNode;  pCurrent->m_val = ch;  pCurrent->m_pLeft = NULL;  pCurrent->m_pRight = NULL;  }else {  if (pCurrent->m_val > ch) {  createBSTree(pCurrent->m_pLeft,ch);  }else if (pCurrent->m_val < ch) {  createBSTree(pCurrent->m_pRight,ch);  }  else  {  return;  }  } } //遍歷二叉樹/*先序遍歷*/ void PreOrderTraverse(BSTreeNode *pCurrent) {  if (NULL == pCurrent) {  return;  }   if (NULL!=pCurrent)  {  //先遍歷根節點  cout<<pCurrent->m_val<<endl;  //在遍歷左節點  PreOrderTraverse(pCurrent->m_pLeft);  //在遍歷右節點  PreOrderTraverse(pCurrent->m_pRight);  }  } //中序遍歷 void InOrderTraverse(BSTreeNode *pCurrent) {  if (NULL == pCurrent) {  return;  }  if (NULL != pCurrent->m_pLeft) {  InOrderTraverse(pCurrent->m_pLeft);  }   showOrderLiust(pCurrent);  //在遍歷右節點  if (NULL != pCurrent->m_pRight) {  InOrderTraverse(pCurrent->m_pRight);  } } //后序遍歷 void EndOrderTraverse(BSTreeNode *pCurrent) {  if (NULL == pCurrent) {  return;  }  if (NULL != pCurrent->m_pLeft) {  EndOrderTraverse(pCurrent->m_pLeft);  }  cout<<pCurrent->m_val<<endl;  //在遍歷右節點  if (NULL != pCurrent->m_pRight) {  EndOrderTraverse(pCurrent->m_pRight);  } } /*該二元查找樹轉換成一個排序的雙向鏈表。  要求不能創建任何新的結點,只調整指針的指向*/ void showOrderLiust(BSTreeNode *pCurrent) {  pCurrent->m_pLeft = pListIndex;  if (NULL != pListIndex) {  pListIndex->m_pRight = pCurrent;  }else  {  pHead = pCurrent;  }  pListIndex = pCurrent;  cout<<pCurrent->m_val<<endl; } int main(int argc,char**argv) {  BSTreeNode *pRoot = NULL;  pHead = NULL;  pListIndex = NULL;  createBSTree(pRoot,'H');  createBSTree(pRoot,'F');  createBSTree(pRoot,'C');  createBSTree(pRoot,'D');  createBSTree(pRoot,'M');  createBSTree(pRoot,'I');  createBSTree(pRoot,'N');  PreOrderTraverse(pRoot);  InOrderTraverse(pRoot);  EndOrderTraverse(pRoot);  delete pRoot;  return 0; } 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频日韩精品| 国产z一区二区三区| 亚洲自拍高清视频网站| 日韩欧美综合在线视频| 日本精品一区二区三区在线| 国产亚洲一级高清| 中文字幕自拍vr一区二区三区| 亚洲一区二区三区乱码aⅴ蜜桃女| 日本精品久久电影| 亚洲国产精品人人爽夜夜爽| 亚洲视频在线免费观看| 日韩精品电影网| 欧美大片va欧美在线播放| 日韩av免费在线播放| 欧美精品免费播放| 国产一区二区三区毛片| 欧洲亚洲免费在线| 中文字幕精品视频| 亚洲第一黄色网| 成人免费视频网址| 免费不卡欧美自拍视频| 久久伊人91精品综合网站| 欧美黄色免费网站| 国产精品黄色影片导航在线观看| 韩日精品中文字幕| 日韩专区中文字幕| 91亚洲精品视频| 国产精品国语对白| 国产91热爆ts人妖在线| 欧美主播福利视频| 亚洲午夜久久久影院| 91精品国产成人| 91亚洲人电影| 国产精品久久久久久久av电影| 久久亚洲精品一区| 国产精欧美一区二区三区| 国产日本欧美一区二区三区在线| 欧美视频在线观看 亚洲欧| 亚洲aⅴ男人的天堂在线观看| 欧美日韩成人免费| 超碰97人人做人人爱少妇| 青草青草久热精品视频在线网站| 精品国产欧美成人夜夜嗨| 日韩大片免费观看视频播放| 亚洲一区美女视频在线观看免费| 66m—66摸成人免费视频| 亚洲电影成人av99爱色| 国产99视频精品免视看7| 久久久久99精品久久久久| 国产成+人+综合+亚洲欧洲| 亚洲欧美一区二区精品久久久| 欧美电影在线免费观看网站| 国产精品久久久久久久久久ktv| 国产成人精品午夜| 97在线视频免费观看| 欧美肥臀大乳一区二区免费视频| 欧美午夜激情小视频| 日韩国产精品亚洲а∨天堂免| 国外成人免费在线播放| 97精品国产97久久久久久免费| 青青草国产精品一区二区| 日韩美女在线观看一区| 性视频1819p久久| 国产97在线|日韩| 久久国产精品久久久久久| 26uuu日韩精品一区二区| 亚洲精品不卡在线| 欧美激情欧美激情| 欧美激情欧美狂野欧美精品| 国产日韩精品电影| 欧美日韩一区二区免费在线观看| 欧美视频免费在线观看| 国产日韩av高清| 成人av色在线观看| 成人激情综合网| 精品动漫一区二区三区| 亚洲电影免费观看高清完整版| 8090成年在线看片午夜| 日韩综合视频在线观看| 韩国国内大量揄拍精品视频| 国产亚洲欧美日韩美女| 国产美女精品免费电影| 91高清视频在线免费观看| 精品国产31久久久久久| 岛国av一区二区在线在线观看| 中文欧美日本在线资源| 亚洲视频第一页| 国产精品亚洲综合天堂夜夜| 国产丝袜精品第一页| 国产午夜精品视频免费不卡69堂| 国产视频亚洲视频| 成人乱色短篇合集| 久久91亚洲精品中文字幕| 一区二区三区日韩在线| 国产在线拍揄自揄视频不卡99| 久色乳综合思思在线视频| 综合av色偷偷网| 亚洲人成欧美中文字幕| 中文字幕国产精品| 国产成人鲁鲁免费视频a| 国产成人jvid在线播放| 国产激情视频一区| xxxx性欧美| 国产精品久久久久77777| 欧美富婆性猛交| 亚洲大胆人体视频| 久久久久久久久久久人体| 欧美成年人在线观看| 亚洲精品suv精品一区二区| 国产精品亚洲一区二区三区| 日本最新高清不卡中文字幕| 日韩免费观看av| 国产一区二区三区中文| 亚洲天堂成人在线| 中文字幕成人精品久久不卡| 日韩精品免费看| 亚洲欧美精品伊人久久| 欧美成人免费大片| 久久久久久免费精品| 久久夜色精品国产亚洲aⅴ| 亚洲午夜性刺激影院| 日韩中文综合网| 97精品国产97久久久久久春色| 成人国产精品一区二区| 亚洲综合社区网| 欧美午夜激情小视频| 欧美精品久久久久| 最新91在线视频| 日本久久久a级免费| 日韩免费看的电影电视剧大全| 精品无人国产偷自产在线| 综合国产在线观看| 欧美在线欧美在线| 亚洲精品mp4| 欧美极品少妇xxxxⅹ喷水| 国产精品色婷婷视频| 欧美黄色免费网站| 欧美精品电影免费在线观看| 福利一区福利二区微拍刺激| 日韩欧美精品免费在线| 在线视频欧美日韩| 亚洲美女久久久| 亚洲欧美激情视频| 欧美中文在线免费| 精品福利樱桃av导航| 亚洲bt欧美bt日本bt| 国产精品欧美激情在线播放| 国产精品自产拍在线观看| 国模精品视频一区二区三区| 久久视频在线观看免费| 亚洲综合一区二区不卡| 久久精品中文字幕免费mv| 欧美一区亚洲一区| 欧美国产日韩一区二区| 欧美激情啊啊啊| 91成品人片a无限观看| 亚洲男人的天堂网站| 亚洲国产精品免费| 欧美体内谢she精2性欧美| 亚洲国产女人aaa毛片在线| 亚洲欧洲美洲在线综合| 久久九九精品99国产精品| 欧美电影在线观看高清| 久久久国产精品一区|