日韩性视频-久久久蜜桃-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.二叉树遍历与线索二叉树(图解+代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 动漫女被黄漫免费视频 | 国产尤物在线观看 | 婷婷色伊人 | 9999av| 爱视频福利网 | 日本成人黄色 | 二区三区偷拍浴室洗澡视频 | 国产黄色片免费在线观看 | 开心激情网站 | 亚洲日本japanese丝袜 | 天天色天天射天天操 | 国产丝袜久久 | 麻豆av免费观看 | 欧美乱妇日本无乱码特黄大片 | 自拍偷拍一区 | 日韩欧美中出 | 日本天堂在线播放 | 国产精品又黄又爽又色无遮挡 | 亚洲黄色小说图片 | 日本在线播放视频 | 免费日韩在线 | 日韩性生活视频 | 亚洲天堂小说 | 91丨九色丨海角社区 | 亚洲人吸女人奶水 | v在线 | 强迫凌虐淫辱の牝奴在线观看 | 91成人免费网站 | 国产亚洲一区二区三区四区 | 一区二区三区四区中文字幕 | 尹人在线视频 | 在线观看av大片 | 青青草国产成人99久久 | 欧美在线天堂 | 影音先锋激情 | 欧美日韩高清免费 | 九九人人| av性色 | av免费福利| 女人脱下裤子让男人捅 | 国产成人免费在线观看 | 操操操影院 | 波多野结衣一区在线 | 美国毛片av | 免费在线看视频 | 樱花电影最新免费观看国语版 | 国产精品夫妻 | 日韩欧美不卡在线 | 牛牛精品一区二区 | 欧美一区二区三区影视 | 欧美大喷水吹潮合集在线观看 | 97成人精品视频在线观看 | 91久久国产综合久久91精品网站 | 国产专区欧美专区 | 亚洲欧美中文日韩在线观看 | 日本免费看 | 色天堂影院 | 国产三级一区二区三区 | 欧美大片在线免费观看 | 欧洲精品码一区二区三区免费看 | 色呦呦呦呦 | 国产黄色一级片视频 | 亚洲精品网站在线播放gif | av在线不卡播放 | 国产一区网 | 亚洲区在线播放 | 欧美黄色大全 | 亚洲妇女无套内射精 | 日韩一级高清 | 精品一区二区久久久 | 激情欧美日韩 | 日韩成人av网址 | 国产av自拍一区 | 精品一区二区在线播放 | 日本一级理论片在线大全 | 亚洲毛茸茸 | 一区二区亚洲 | 69视频在线看 | 欧美精品日韩在线 | 亚洲成a | 亚洲精品在线免费播放 | 国产精品成人一区二区三区 | 在线成人av网站 | 三日本三级少妇三级99 | asian性开放少妇pics | 日本成人激情 | 免费中文字幕日韩欧美 | www天堂在线 | 影音先锋色小姐 | 蜜乳av一区 | 美女隐私直播 | 蝌蚪久久 | 天天色天| 亚洲高清视频在线 | 国产黄色网 | 中文字幕+乱码+中文字幕明步 | 日韩欧美亚洲视频 | 伊人啪啪网 | 亚洲一区二区三区国产 |