日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数据结构-树】2.二叉树遍历与线索二叉树(图解+代码)

發布時間:2025/3/20 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构-树】2.二叉树遍历与线索二叉树(图解+代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、二叉樹的定義及其主要特征

1.1 二叉樹的概念

二叉樹是另一種樹形結構,其特點是每個結點最多含兩棵子樹(也就是說,二叉樹的度≤2)。

二叉樹是一種有序樹,若將其左、右子樹顛倒,則成為另一顆不同的二叉樹。

二叉樹可以為空

1.2 二叉樹和度為2的有序樹

在這里要區分一個概念,也就是二叉樹和度為2的有序樹之間的區別。

  • 度為2的樹至少有3個結點,而二叉樹則可以是一顆空樹
  • 度為2的有序樹的孩子結點,左右次序是相對于另一孩子結點而言的,若某個結點只有一個孩子結點,則這個結點就無須區分其左右次序。但,二叉樹無論其孩子數是否為2,均需確定其左右次序,也就是說,二叉樹的孩子結點的次序是絕對的。
  • 1.3 幾種特殊的二叉樹

    1. 滿二叉樹

    一顆高度為h,且含有2h?12^h-12h?1個結點的二叉樹就是一顆滿二叉樹。

    滿二叉樹的特點:

  • 每一層的結點個數為 2h?12^{h-1}2h?1
  • 葉子結點之外的每個結點的度都是2
  • 葉子結點都位于同一層
  • 對整棵樹按從1開始從上到下,自左向右編號,對于編號為i的結點,若有雙親,則雙親的位置 i2(向下取整)\frac{i}{2}(向下取整)2i?(),若有左孩子,則左孩子的編號為2i+12i+12i+1,若有右孩子,則右孩子的編號為2i+22i+22i+2
  • 2. 完全二叉樹

    設有一個高度為h,有n個結點的二叉樹,當且僅當每個結點都與高度為h的滿二叉樹中編號1~n的結點一一對應時,就是一顆完全二叉樹

    完全二叉樹的特點:

  • 葉子結點只可能在層次最大的兩層上出現,且對于最大層次中葉子結點都依次排列在該層最左側的位置
  • 若出現度為1的結點,有且僅有可能一個,且只有左孩子
  • 3. 二叉排序樹

    一棵空樹,或者是具有下列性質的二叉樹:

  • 若左子樹不空,則左子樹上所有結點的值均小于它的根結點的值;
  • 右子樹不空,則右子樹上所有結點的值均大于或等于它的根結點的值;
  • 左、右子樹也分別為二叉排序樹;
  • 4. 平衡二叉樹

    樹上任一結點的左子樹和右子樹的深度不大于1

    二叉樹的存儲結構

    順序存儲結構:用一組地址連續的存儲單元存儲。滿二叉樹和完全二叉樹使用較為合適。其他樹使用數組中可能有空結點

    鏈式存儲結構:用指針指向根結點的孩子結點。二叉樹的存儲結構一般有三個域:1. 數據域data,2. 左指針域left,3. 右指針域right

    struct BinaryTreeNode{int data;BinaryTreeNode *left;BinaryTreeNode *right; };

    二叉樹的遍歷

    示例樹如下:

    1. 先序遍歷

    若二叉樹為空,則什么都不做,否則

  • 訪問根結點
  • 先序遍歷左結點
  • 先序遍歷右結點
  • 以先序遍歷方式遍歷示例樹,結果為:ABDECFG

    void preorder(TreeNode *node, int layer) {if(!node) {return;}do something;preorder(node->left, layer + 1);preorder(node->right, layer + 1); }

    2. 中序遍歷

    若二叉樹為空,則什么都不做,否則

  • 先序遍歷左結點
  • 訪問根結點
  • 先序遍歷右結點
  • 以中序遍歷方式遍歷示例樹,結果為:DBEAFCG

    void inorder(TreeNode *node, int layer) {if(!node) {return;}preorder(node->left, layer + 1);do something;preorder(node->right, layer + 1); }

    3. 后序遍歷

    若二叉樹為空,則什么都不做,否則

  • 先序遍歷左結點
  • 先序遍歷右結點
  • 訪問根結點
  • 以后序遍歷方式遍歷示例樹,結果為:DEBFCGA

    void postorder(TreeNode *node, int layer) {if(!node) {return;}preorder(node->left, layer + 1);preorder(node->right, layer + 1);do something; }

    4. 層次遍歷

    要進行層次遍歷,需要借助一個隊列。先將二叉樹根結點入隊,然后出隊,若它有左子樹,則將左子樹根結點入隊;若它有右子樹,則將右子樹根結點入隊。然后出隊,對出隊結點訪問,如此反復,直到隊列為空

    以層序遍歷方式遍歷示例樹,結果為:ABCDEFG

    void Sequence(TreeNode *node) {queue<TreeNode *> q;q.push_back(node);while(!q.empty()) {TreeNode *root = node;q.pop();} }

    反過來討論,給你一個中序序列和一個其他遍歷序列能否構造出唯一一顆二叉樹。答案是可以的。

    如,先序序列:ABDECFG,中序序列:DBEAFCG

  • 先序序列第1個就是根結點,那么在中序序列中,以A為界,整個字符串分為兩節,分別是DBE和FCG
  • 先序序列第2個就是其左子樹的根結點,那么在中序序列中,以B為界,DBE字符串分為兩節,分別是D和F,在B左邊的就是B的左子樹根結點,在B右邊的就是B的右子樹的根結點。
  • 同理推得A的右子樹的根結點,往復循環即可。
  • 線索二叉樹

    在二叉樹的結點上加上線索的二叉樹稱為線索二叉樹,對二叉樹以某種遍歷方式(如先序、中序、后序或層次等)進行遍歷,使其變為線索二叉樹的過程稱為對二叉樹進行線索化。

    線索鏈表解決了無法直接找到該結點在某種遍歷序列中的前驅和后繼結點的問題,解決了二叉鏈表找左、右孩子困難的問題。

    在二叉樹線索化時,通常規定:若無左子樹,令lchild指向其前驅結點;若無右子樹,令rchild指向其后繼結點

    線索二叉樹的存儲結構:

    struct ThreadBinaryTreeNode{int data;ThreadBinaryTreeNode *lchild; // 指向左孩子結點ThreadBinaryTreeNode *rchild; // 指向右孩子結點int ltag; // 0表示結點的左孩子,1 表示結點的前驅int rtag; // 0表示結點的右孩子,1 表示結點的后繼 };

    樹轉化為二叉樹

    樹轉換為二叉樹的規則:每個結點左指針指向他的第一個孩子結點,右指針指向它在樹中的相鄰兄弟結點,可以表示為 “左孩子右兄弟”。

    將樹轉換成二叉樹的步驟是:

  • 加線,就是在所有兄弟結點之間加一條連線;
  • 去線,就是對樹中的每個結點,只保留他與第一個孩子結點之間的連線,刪除它與其它孩子結點之間的連線
  • 調整,就是以樹的根結點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明。
  • 二叉樹轉換為樹

    二叉樹轉換為樹是樹轉換為二叉樹的逆過程,其步驟是:

  • 若某結點的左孩子結點存在,將左孩子結點的右孩子結點、右孩子結點的右孩子結點……都作為該結點的孩子結點,將該結點與這些右孩子結點用線連接起來;
  • 刪除原二叉樹中所有結點與其右孩子結點的連線;
  • 整理步驟1和步驟2兩步得到的樹,使之結構層次分明。
  • 森林轉化為二叉樹

    森林是由若干棵樹組成,可以將森林中的每棵樹的根結點看作是兄弟,由于每棵樹都可以轉換為二叉樹,所以森林也可以轉換為二叉樹。

    將森林轉換為二叉樹的步驟是:

  • 先把每棵樹轉換為二叉樹;
  • 第一棵二叉樹不動,從第二棵二叉樹開始,依次把后一棵二叉樹的根結點作為前一棵二叉樹的根結點的右孩子結點,用線連接起來。
  • 當所有的二叉樹連接起來后得到的二叉樹就是由森林轉換得到的二叉樹。


  • 二叉樹轉化為森林

    二叉樹轉換為森林比較簡單,其步驟如下:

  • 先把每個結點與右孩子結點的連線刪除,得到分離的二叉樹;(二叉樹→森林)
  • 把分離后的每棵二叉樹轉換為樹;(森林中的每棵樹→二叉樹)
  • 整理步驟2得到的樹,使之規范,這樣得到森林。
  • 二叉樹連接起來后得到的二叉樹就是由森林轉換得到的二叉樹。


    總結

    以上是生活随笔為你收集整理的【数据结构-树】2.二叉树遍历与线索二叉树(图解+代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产成人亚洲欧洲在线 | 懂色av中文一区二区三区天美 | 国产精品一二三四 | 日韩簧片 | 老司机深夜影院 | av啊啊 | 午夜精品一区二区三区在线观看 | 欧美一区二区三区在线 | 91草草草| 中国精品一区二区 | 毛片官网 | 国产露脸150部国语对白 | 日本a级片在线播放 | 天堂网资源 | 国产成人观看 | 色七七桃花综合影院 | 91精品国产91久久久久久久久久久久 | 夜夜天天 | 免费日韩精品 | 激情深爱五月 | 综合精品国产 | 久久久高清 | 日韩av一区二区在线观看 | 国产精品电影在线观看 | 国产www视频 | 国产日韩一区二区在线观看 | 99欧美| 精品成人无码久久久久久 | 精品人妻人人做人人爽夜夜爽 | 免费色片网站 | 我们2018在线观看免费版高清 | 成人aaa视频 | 激情宗合网 | melody在线高清免费观看 | 又黄又骚的视频 | 色老头av| 国产精品日韩欧美大师 | 一区福利视频 | av直播在线观看 | av片一区二区 | 香蕉久热 | 成人必看www.| 日日爽日日操 | 三级全黄做爰龚玥菲在线 | 男女做爰猛烈刺激 | 久久99免费 | 国产成人精品一区二区三区网站观看 | 国产精成人品免费观看 | 动漫美女无遮挡免费 | 亚洲二区av | 久久婷婷色综合 | 成人黄色网址在线观看 | 黄色一级片. | 人妻 校园 激情 另类 | 大尺度叫床戏做爰视频 | 女人下面流白浆的视频 | 黄色工厂在线观看 | 999成人网 | 三级av在线播放 | 国产精品羞羞答答在线观看 | 婷婷激情影院 | 99久久婷婷国产精品综合 | 日日操天天操 | 99久热在线精品996热是什么 | 黄色片网站免费 | 性欧美ⅹxxxx极品护士 | 成年人免费网站在线观看 | 不卡av片| 人妻无码中文字幕 | www.jizzjizz| 性久久久久久 | 激情久久av一区av二区av三区 | 琪琪免费视频 | 熟女俱乐部一区二区视频在线 | 另类综合视频 | 国产美女主播在线观看 | 一区视频| 亚洲国产综合在线 | 天天爽一爽 | 国产精品亚洲二区在线观看 | www.狠狠| 亚洲看片 | 日韩性xxx | 日本一区电影 | 欧美亚洲视频 | 免费国产黄色网址 | 91精品免费视频 | 91免费国产视频 | 激情午夜视频 | 亚洲成av人片 | 私库av在线| 中国挤奶哺乳午夜片 | 老熟妇仑乱一区二区视频 | 国产成人99久久亚洲综合精品 | 亚洲成人第一页 | 亚洲国产成人91精品 | 成人免费高清视频 | 国产福利一区二区 | 精品人伦一区二区 |