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

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

一波二叉樹遍歷問題的C++解答實例分享

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

題目一:

  輸入一顆二元樹,從上往下按層打印樹的每個節點,同一層按照從左往右的順序打印。

輸入樣例:

 8 / / 6 10/ / / /5 7 9 11

輸出樣例:

復制代碼 代碼如下:
8 6 10 5 7 9 11

思路分析:

    把一顆二叉樹抽象成三個節點:根節點、左節點、右節點。

    先序遍歷即可得到按行輸出的效果。

    對于左子樹只要保存其根節點,既保存了整個左子樹。(右子樹一樣)

    對于根節點之外的兩個子樹來說說,始終是先訪問左子樹的根節點,再訪問右子樹的根節點。

    因此可以使用隊列存儲。

代碼實現(GCC編譯通過):

#include "stdio.h"#include "stdlib.h" //二叉樹節點#define size 7 //二叉樹節點定義typedef struct node{  int data;  struct node *left;  struct node *right;}BTree; int printLine(BTree * root);BTree * CreatTree(int a[],int n); int main(void){     int array[size] = {8,6,10,5,7,9,11};    BTree * root;     root = CreatTree(array,size);  printLine(root);       printf("/n");  return 0;} int printLine(BTree * root){  BTree * queue[size], *p;  int front,rear;  front = rear = 0;           rear = (rear+1)%size;  queue[rear] = root;       //循環結束為隊列為空  while(front != rear)  {          //根出隊列    front = (front +1)%size;    p = queue[front];    printf("%3d",p->data);     //左孩子不空,隊不滿入隊    if(p->left && ((rear+1)%size != front))    {      rear = (rear+1)%size;      queue[rear] = p->left;    }                 //右孩子不空,隊不滿入隊    if(p->right && ((rear+1)%size != front))    {      rear = (rear+1)%size;      queue[rear] = p->right;    }                 //隊滿,報錯    if((rear+1)%size == front)    {      printf("隊列空間不足,錯誤..../n");      return 0;    }  }   return 1;} //根據數組創建二叉排序樹BTree * CreatTree(int a[],int n){    BTree * root ,*p,*cu,*pa;    int i;     root = (BTree *)malloc(sizeof(BTree));    root->data = a[0];    root->left = root->right =NULL;     for(i=1;i<n;i++)    {        p = (BTree *)malloc(sizeof(BTree));        p->data = a[i];        p->left = p->right =NULL;        cu = root;         while(cu)        {            pa = cu;            if(cu->data > p->data)                cu = cu->left;            else                cu = cu->right;        }        if(pa->data > p->data)            pa->left = p;        else            pa->right = p;    }     return root;}

題目二:

輸入一個整數數組,判斷該數組是不是某二元查找樹的后序遍歷的結果。

如果是返回 true,否則返回 false。

例如輸入 5、7、6、9、11、10、8,由于這一整數序列是如下樹的后序遍歷結果:

8/  /6  10/  /  /  /5  7  9  11

因此返回 true。

如果輸入 7、4、6、5,沒有哪棵樹的后序遍歷的結果是這個序列,因此返回 false。

思路:

二叉查找的特征:左子樹的各個值均小于根,右子樹的各個值均大于跟

后序遍歷的特征:最后一個是根,便利順序,左右跟。遞歸

好了,總結可以得到:

最后一個是根,最開始連續若干個數小于根的是左子樹的節點,之后連續若干個大于根的是右子樹的節點(左右子樹都可能為空),然后遞歸描述。

代碼描述如下(GCC編譯通過):

#include "stdio.h"#include "stdlib.h" int isPostorderResult(int a[],int n);int helper(int a[],int s,int e); int main(void){  int a[7] = {5,7,6,9,11,10,8};  int b[4] = {7,4,6,5};  int tmp;   tmp = isPostorderResult(a,7);  printf("%d",tmp);   return 0;}   int isPostorderResult(int a[],int n){  return helper(a,0,n-1);} int helper(int a[],int s,int e){  int i,j,root;     if(s == e)    return 1;    for(i=0;i<e && a[i]<a[e];i++);  if(i != 0 && helper(a,s,i-1) == 0)    return 0;   for(j=i;j<e && a[j]>a[e];j++);  if(j==e && helper(a,i,j-1) == 1)    return 1;  else    return 0;      }

題目三:

輸入一顆二元查找樹,將該樹轉換為它的鏡像,即在轉換后的二元查找樹中,左子樹的結點都大于右子樹的結點。
用遞歸和循環兩種方法完成樹的鏡像轉換。
例如輸入:

8/ /6 10// //5 7 9 11

輸出:

    8  /     /  10     6  //       //11   9   7   5

分析:

遞歸程序設計比較簡單

    訪問一個節點,只要不為空則交換左右孩子,然后分別對左右子樹遞歸。

非遞歸實質是需要我們手動完成壓棧,思想是一致的

代碼如下(GCC編譯通過):

#include "stdio.h"#include "stdlib.h" #define MAXSIZE 8 typedef struct node{  int data;  struct node * left;  struct node * right;}BTree; void swap(BTree ** x,BTree ** y);//交換左右孩子void mirror(BTree * root);//遞歸實現函數聲明void mirrorIteratively(BTree * root);//非遞歸實現函數聲明BTree * CreatTree(int a[],int n);//創建二叉樹(產生二叉排序樹)void Iorder(BTree * root);//中序遍歷查看結果 int main(void){  int array[MAXSIZE] = {5,3,8,7,2,4,1,9};  BTree * root;   root = CreatTree(array,MAXSIZE);   printf("變換前:/n");  Iorder(root);   printf("/n變換后:/n");//兩次變換,與變化前一致  mirror(root);  mirrorIteratively(root);  Iorder(root);     printf("/n");   return 0;} void swap(BTree ** x,BTree ** y){  BTree * t = * x;  * x = * y;  * y = t;} void mirror(BTree * root){  if(root == NULL)//結束條件    return;     swap(&(root->left),&(root->right));//交換  mirror(root->left);//左子樹遞歸  mirror(root->right);//右子樹遞歸} void mirrorIteratively(BTree * root){  int top = 0;  BTree * t;  BTree * stack[MAXSIZE+1];     if(root == NULL)    return;   //手動壓棧、彈棧  stack[top++] = root;  while(top != 0)  {    t = stack[--top];       swap(&(t->left),&(t->right));     if(t->left != NULL)      stack[top++] = t->left;    if(t->right != NULL)      stack[top++] = t->right;  }} //產生二叉排序樹BTree * CreatTree(int a[],int n){  BTree * root ,*p,*cu,*pa;  int i;     root = (BTree *)malloc(sizeof(BTree));  root->data = a[0];   root->left = root->right =NULL;   for(i=1;i<n;i++)  {    p = (BTree *)malloc(sizeof(BTree));    p->data = a[i];    p->left = p->right =NULL;    cu = root;     while(cu)    {      pa = cu;      if(cu->data > p->data)        cu = cu->left;      else        cu = cu->right;    }    if(pa->data > p->data)      pa->left = p;    else      pa->right = p;  }     return root;}//中序遍歷void Iorder(BTree * root){  if(root)  {        Iorder(root->left);    printf("%3d",root->data);    Iorder(root->right);  }}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩国产精品亚洲а∨天堂免| 亚洲一区亚洲二区亚洲三区| 亚洲欧洲偷拍精品| 欧美极品在线播放| 国产精品美女免费视频| 久久视频免费观看| 久久久久久久91| 国产精品久久久亚洲| 日本乱人伦a精品| 日韩h在线观看| 国产精品久久国产精品99gif| 欧美精品18videos性欧美| 精品久久中文字幕| 日韩精品免费在线| 欧洲美女7788成人免费视频| 国产视频久久久| 国产a级全部精品| 欧美在线视频一区| 久久视频中文字幕| 欧美日韩国产色视频| 久久夜色精品亚洲噜噜国产mv| www.欧美免费| 久久久久久69| 欧美一区二区.| 国产精品福利久久久| 国产精品男人的天堂| 国产精品亚洲自拍| 国产精品一区二区av影院萌芽| 欧美黑人极品猛少妇色xxxxx| 91夜夜揉人人捏人人添红杏| 欧美性xxxx18| 久久久久久久久久久av| 成人性教育视频在线观看| 精品露脸国产偷人在视频| 久久久久在线观看| 亚洲图片在区色| 91视频免费网站| 欧美成人午夜激情视频| 日韩av在线天堂网| 日韩成人久久久| 亚洲激情成人网| 久久久久久久久国产精品| 亚洲在线观看视频网站| 欧美激情视频网址| 国产91色在线免费| 欧美华人在线视频| 国产精品都在这里| 亚洲人成电影网站色| 日本欧美精品在线| 亚洲成人av片在线观看| 91精品国产免费久久久久久| 欧美电影免费观看网站| 热re91久久精品国99热蜜臀| 欧美亚洲视频在线看网址| 日韩乱码在线视频| 中文字幕亚洲无线码在线一区| 欧美日韩免费网站| 538国产精品一区二区在线| 国产精品福利在线观看网址| 色综合天天综合网国产成人网| 日本免费一区二区三区视频观看| 精品福利在线视频| 中文字幕亚洲国产| 国内精品中文字幕| 91视频九色网站| 亚洲精品欧美极品| 97在线视频精品| 国产精品99一区| 黄色成人在线播放| 日韩av最新在线观看| 成人亚洲激情网| 亚洲图片欧美午夜| 久久亚洲国产精品| 亚洲日韩中文字幕| 91精品国产综合久久香蕉的用户体验| www亚洲欧美| 久久久亚洲欧洲日产国码aⅴ| 黄色91在线观看| 中文字幕欧美精品日韩中文字幕| 国产成人jvid在线播放| 精品高清美女精品国产区| 成人福利网站在线观看| 综合国产在线视频| 亚洲成人教育av| 欧美成在线视频| 91欧美视频网站| 欧美丰满片xxx777| 国产99久久精品一区二区 夜夜躁日日躁| 中文字幕一区电影| 日韩av免费在线| 激情懂色av一区av二区av| 国产精品欧美日韩一区二区| 97色在线播放视频| 97视频国产在线| 欧美一区视频在线| 亚洲一区亚洲二区| 欧美又大又硬又粗bbbbb| 精品久久久视频| 亚洲国产精品人久久电影| 欧美国产在线电影| 久久久久久久久爱| 日韩美女在线播放| 国产精品美女主播| 午夜精品久久久久久久99热| 国内精品久久久久影院 日本资源| 欧洲亚洲在线视频| 精品免费在线视频| 97人洗澡人人免费公开视频碰碰碰| 国产成人精品免高潮在线观看| 日韩亚洲欧美中文高清在线| 91久久精品国产91久久| 亚洲的天堂在线中文字幕| 国产精品久久久久77777| 亚洲第一页在线| 欧美中文字幕第一页| 91网站在线看| 欧美一二三视频| 欧美黑人性猛交| 国产精品69精品一区二区三区| 亚洲性69xxxbbb| 欧美国产日韩一区| 亚洲国产精品高清久久久| 国产国语刺激对白av不卡| 久久影视电视剧免费网站清宫辞电视| 久热精品视频在线观看一区| 久久久欧美一区二区| xvideos成人免费中文版| 国产精品夜色7777狼人| 欧美黑人又粗大| 欧美日韩人人澡狠狠躁视频| 色与欲影视天天看综合网| 久久久久久久一区二区三区| 久久久精品视频成人| 国产日韩换脸av一区在线观看| 中文字幕免费国产精品| 91免费看国产| 色噜噜狠狠色综合网图区| 国产精品成人国产乱一区| 欧美综合第一页| 亚洲性视频网站| 91中文在线观看| 成人观看高清在线观看免费| 日韩在线视频中文字幕| 国产www精品| 日本高清视频精品| 欧美日韩在线观看视频| 一区二区欧美久久| 国产色综合天天综合网| 亚洲精品www| 精品久久久精品| 久久久久久久国产| 国产自产女人91一区在线观看| 中文字幕久精品免费视频| 久久99久久99精品中文字幕| 91精品免费看| 国产在线播放不卡| 国产精品自产拍在线观看中文| 亚洲欧美色图片| 欧美多人乱p欧美4p久久| 亚洲乱亚洲乱妇无码| 欧美亚洲成人网| 国产一区二区三区视频在线观看| 久久人人爽国产| 高清欧美性猛交xxxx黑人猛交|