<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      潭影-pjq

      二叉樹的層次建樹

      如何層次建立一顆二叉樹呢?假設我們需要建一棵樹。
      這棵樹層次遍歷得到的序列是:abcdefg
      (但是注意,我們只有知道一顆二叉樹前/后/層序遍歷中的任意一種和中序遍歷時,才能唯一確定一顆二叉樹,我們在這里是直接給出了樹的形狀,當然能唯一確定二叉樹,但是事實上,只告訴了層序遍歷得到的序列,我們沒有辦法確定樹的形狀,而以下代碼,建出來的樹一定是完全二叉樹)

       

       

       首先定義二叉樹的類型

      typedef char ElemType;      //我們在數據域存入字符類型的數據
      typedef struct BiTNode {
          ElemType c;//數據域
          struct BiTNode* lchild, * rchild;//左、右孩子的指針
      }BiTNode,*BiTree;//在后續操作中,BiTNode強調是一個結點,BiTree強調是一棵樹

       

      再定義一個輔助鏈表,用于存放二叉樹中各個結點的指針,便于我們建樹(這里存放的是指針,而不是整個結點,這樣的操作可以省一些內存空間,降低空間復雜度)

      typedef struct tag {
          BiTree p;           //某一個結點的指針
          struct tag* pnext;  //下一個結點的指針
      }tag_t;  //在后續操作中tag_t強調這是鏈表中的一個結點

      先序遍歷

      void PreOrder(BiTree T)//先序遍歷
      {
          if (T != NULL)
          {
              putchar(T->c);
              PreOrder(T->lchild);
              PreOrder(T->rchild);
          }
      }

      開始建樹

      int main()
      {
          //開始建二叉樹
          BiTree T=NULL;//首先聲明一棵二叉樹,此時二叉樹為空
          BiTNode* pnew=NULL;//表示用于存放將要存入樹中的元素
          tag_t* phead=NULL; //在后續操作中phead始終指向輔助鏈表的頭部(這個鏈表沒帶頭結點)
          tag_t* ptail=NULL; //而ptail指向輔助鏈表的尾部
          tag_t* pcur=NULL;  //pcur表示current,即當前指向當前鏈表中的一個結點,
                             //——我暫時說不清它指向哪個結點,但是可以確定的是,它不是指向新的結點
          tag_t* listpnew=NULL;//表示新的結點
          char c;//需要被讀取的元素
          while (scanf("%c", &c) != EOF) //EOF表示讀取結束
          {
              if (c == '\n')  //注意這個判斷條件,一般都是"==",而賦值是"="
              {
                  break;      //如果c=='\n',跳出讀取,因為%c會讀取換行符,也就是它會把'\n'當作一個字符
              }
              pnew = (BiTNode*)calloc(1, sizeof(BiTNode));//用于暫存二叉樹的新結點
              pnew->c = c;                                //新結點的屬于設為讀入的元素
              listpnew = (tag_t*)calloc(1, sizeof(BiTNode));//用于將存放二叉樹新結點的地址
              listpnew->p = pnew;                           //數據域設為pnew
              if (T == NULL)
              {
                  T = pnew;               //樹空則填入第一個結點
                  phead = listpnew;       //并將phead,ptail,pcur,都指向listpnew
                  ptail = listpnew;       //雖然每次讀入一個元素這個listpnew一直在變化成一個新的鏈表結點
                  pcur = listpnew;        //但是這個phead指向的地址卻不變,相當于又一個鏈表,phead指向鏈表頭
                                          //ptail指向鏈表尾
                  continue;//一定要加這個continue,表示結束這一次循環,也就是說我們添加了根節點之后,這部分if語句里的代碼就不用管了
              }
              else
              {
                  ptail->pnext = listpnew; //將新元素插入鏈表尾部
                  ptail = listpnew;        //ptail指向鏈表尾部
              }
              if (pcur->p->lchild == NULL)//二叉樹中的一個結點的左子樹為空
              {
                  pcur->p->lchild = pnew; //將其左子樹填入新結點
              }
              else if (pcur->p->rchild == NULL)//右子樹為空
              {
                  pcur->p->rchild = pnew;   //將其右子樹填入新的結點
                  pcur = pcur->pnext; //當左右子樹都填入結點之后,表示這個節點的數據域,左右孩子域內都有元素了
                                      //那么此時pcur就可以指向下一個鏈表中的節點了
                  //比如層次建樹。前三個元素是abc,a是根節點,在a的左孩子填入b,在a的右孩子填入c,那么a就可以功成身退了
                  //此時鏈表中的元素是abc,繼而將pur指向結點b,繼續在b的左右孩子域填入新結點,依此類推,直到所有元素完全填入
              }
          }
          PreOrder(T);
          //abcdefg
      }

       

      posted on 2022-05-04 19:56  潭影-pjq  閱讀(288)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 子洲县| 国产欧美日韩另类在线专区| 精品免费国产一区二区三区四区| 十堰市| 日韩伦理片| 国产中文字幕精品喷潮| 丝袜老师办公室里做好紧好爽| 久久精品夜夜夜夜夜久久| 老熟妇国产一区二区三区 | 国产精品自拍中文字幕| 亚洲另类欧美综合久久图片区| 一区二区不卡国产精品| 日韩有码av中文字幕| 国产精品一二三区蜜臀av| 国色天香成人一区二区| 镇远县| 97在线碰| 亚洲av日韩av一区久久| 精品久久久久中文字幕日本| 少妇高潮潮喷到猛进猛出小说| 久久日产一线二线三线| 国产成人麻豆亚洲综合无码精品| 亚洲欧美牲交| 成人av天堂网在线观看| 实拍女处破www免费看| 国产精品黄色精品黄色大片| 欧美人与zoxxxx另类| 一区二区三区激情免费视频| 成人午夜激情在线观看| 日本亚洲中文字幕不卡| 亚洲精品一区二区三区大| 狠狠v日韩v欧美v| 国产乱码精品一区二区上| 亚洲V天堂V手机在线| 亚洲成人精品综合在线| 亚洲高清国产成人精品久久| 国产成人精品亚洲午夜| 秋霞人妻无码中文字幕| 国精偷拍一区二区三区| 国产精品天天看天天狠| 国产在线无码精品无码|