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

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

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

2020-02-24 14:25:40
字體:
來源:轉載
供稿:網友

二叉樹主要用于解決尋找線性前體和節點后繼不方便的問題,其實它只增加了兩個標記域,下文是武林技術頻道小編為大家帶來的詳解C++ 遍歷二叉樹實例介紹,一起去看看吧。

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; } 

以上就是詳解C++ 遍歷二叉樹實例介紹,你學習到了嗎?如果你想了解其他的專業知識,建議你來js.Vevb.com進行了解。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产小视频| 国产成人综合亚洲| 国产成人福利夜色影视| 日韩av在线最新| 亚洲综合在线播放| 国产一区视频在线| 成人a在线观看| 91麻豆桃色免费看| 日本精品中文字幕| 亚洲天堂免费在线| 亚洲国产美女久久久久| 亚洲男人av在线| www国产精品com| 日韩精品久久久久久福利| 成人夜晚看av| 久久激情五月丁香伊人| 日本道色综合久久影院| 欧美日韩在线观看视频| 亚洲一区二区中文| 亚洲加勒比久久88色综合| 精品成人久久av| 欧美日本亚洲视频| 超薄丝袜一区二区| 精品久久久久人成| 日韩中文视频免费在线观看| 日韩亚洲在线观看| 日韩欧美精品网站| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲片国产一区一级在线观看| 国产精品直播网红| 久久偷看各类女兵18女厕嘘嘘| 国产精品观看在线亚洲人成网| 亚洲国产女人aaa毛片在线| 国产精品久久电影观看| 福利一区视频在线观看| 国产精品久久综合av爱欲tv| 97激碰免费视频| 国产欧美久久久久久| 国产激情久久久久| 97在线看福利| 久久久999精品| 成人做爰www免费看视频网站| 91精品久久久久久久久久另类| 国产日韩欧美视频在线| 国产精品揄拍一区二区| 最近2019中文字幕第三页视频| 亚洲成年人影院在线| 97在线看福利| 日本精品久久久久久久| 亚洲欧美日韩在线一区| 人九九综合九九宗合| 欧美激情喷水视频| 亚洲午夜av久久乱码| 久久99热这里只有精品国产| 亚洲女人被黑人巨大进入| 91久久嫩草影院一区二区| 91欧美视频网站| 欧美一级黄色网| 亚洲人精选亚洲人成在线| 国产精品wwwwww| 亚洲最大的成人网| 亚洲欧美日韩国产精品| 日本精品中文字幕| 亚洲成年人在线播放| 久久久国产在线视频| 亚洲跨种族黑人xxx| 成人信息集中地欧美| 国产精品户外野外| 欧美极品xxxx| 欧美国产日韩精品| 国产成人精品在线观看| 欧美性xxxxxxx| 一区二区三区视频免费在线观看| 国产精品女主播| 欧美最猛黑人xxxx黑人猛叫黄| 黑人巨大精品欧美一区免费视频| 国产精品久久久久久五月尺| 欧美人与性动交a欧美精品| 在线播放日韩精品| 91免费福利视频| 亚洲美女在线观看| 中文字幕精品视频| 欧美国产日韩中文字幕在线| 亚洲美女福利视频网站| 欧美乱人伦中文字幕在线| 日韩有码在线播放| 精品电影在线观看| 91国产美女在线观看| 欧亚精品在线观看| 成人黄色中文字幕| 久久视频国产精品免费视频在线| 日日噜噜噜夜夜爽亚洲精品| 国产欧美一区二区| 成人激情在线播放| 亚洲韩国欧洲国产日产av| 欧美高清激情视频| 精品视频中文字幕| 亚洲欧美激情四射在线日| 欧美性视频网站| 国产亚洲综合久久| 2021国产精品视频| 国产成人在线亚洲欧美| 精品女同一区二区三区在线播放| 最新的欧美黄色| 精品久久久久人成| 91香蕉嫩草神马影院在线观看| 97在线视频免费| 午夜剧场成人观在线视频免费观看| 国产免费观看久久黄| 国产自摸综合网| 日日摸夜夜添一区| 久久电影一区二区| 91精品国产自产在线| 国产自摸综合网| 欧美激情一区二区三区在线视频观看| 成人啪啪免费看| 国产经典一区二区| 久久久国产视频| 97精品视频在线播放| 51久久精品夜色国产麻豆| 这里精品视频免费| 91av成人在线| 亚洲天堂av图片| 欧美久久久精品| 欧美另类99xxxxx| 国产精品一二三在线| 日韩在线视频一区| 色av中文字幕一区| 亚洲影院污污.| 最近免费中文字幕视频2019| 91亚洲永久免费精品| 国产情人节一区| 国产一区玩具在线观看| 日本精品va在线观看| 久久精品国产亚洲| 91国偷自产一区二区三区的观看方式| 欧美情侣性视频| 国产精品美乳在线观看| 精品一区二区电影| 久久这里只有精品视频首页| 91在线播放国产| 一区二区三区视频在线| 激情亚洲一区二区三区四区| 亚洲成人免费在线视频| 一本大道香蕉久在线播放29| 精品欧美一区二区三区| 久久精品99国产精品酒店日本| 日韩欧美在线视频免费观看| 久久九九热免费视频| 国产欧美日韩亚洲精品| 国产精品一区二区三区久久久| 亚洲第一福利网| 97国产在线观看| 中文字幕欧美视频在线| 韩国三级日本三级少妇99| 欧美日韩中文字幕在线| 欧美精品久久久久久久免费观看| 欧美激情亚洲自拍| 在线午夜精品自拍| 欧美日韩国产成人高清视频| 国产精品久久久久久亚洲影视| 91国产中文字幕| 欧美小视频在线观看| 日本高清久久天堂|