1. 程式人生 > >資料結構之樹與二叉樹

資料結構之樹與二叉樹

  前幾天被面試官問到了二叉樹,因為沒有去複習所以回答的很糟糕,資料結構是大二的時候學的,在平時的web開發我能用到的機會其實不多,所以也沒有去整理,但是資料結構也是程式的靈魂架構,是需要認真研究的,故在此繼續進行整理複習。

  一、什麼是樹?

1.1  樹是n(n>=0)個結點的有限集,根據結點數可分為空樹(n=0)或非空樹(n>0),對於非空的樹T,有著兩個定義:

(1)有且僅有一個稱之為根的結點;

(2)除根結點以外的其餘結點可分為m(m>0)個互不相交的有限集T1,T2,...,Tm,其中每個集合本身又是一個樹,並且又稱之為根的子樹。

常見的樹如下圖:


1.2 常見的樹基本術語:

(1)結點:樹中的一個獨立單位。包含一個數據元素及若干指向其子樹的分支,如圖中的每個字母都是一個結點。

(2)結點的度:結點所擁有的子樹數稱為結點的度,如D的度為3,E的度數為1。

(3)樹的度:樹的度是樹內各結點度的最大值,上圖的樹的度為3.

(4)葉子:度為0的結點稱為葉子或終端結點。如上圖的G,H,I,J,F.

(5)非終端結點:度不為0的結點稱為非終端結點或分支結點。除根結點之外,也稱為內部結點。如上圖的A,B,C,D,E.

(6)雙親和孩子:若一個結點含有子結點,則這個結點稱為其子節點的雙親節點。如上圖的D的雙親結點為B

(7)兄弟:具有同個雙親的結點互為兄弟結點。如上圖的G,I,H

(8)祖先:從根到該結點所經分支上的所有結點。如上圖的J的祖先為A,C,E

(9)子孫:以某個結點為根的子樹中的任一結點都是該根結點的子孫。如上圖B的子孫有D,G,H,I

(10)層次:結點的層次從根開始定義,如上圖的層次說明。

(11)堂兄弟:雙親在同一層的結點互為堂兄弟。例如結點D的堂兄弟為E,F.

(12)樹的深度:樹中結點的最大層次稱之為樹的深度或高度。如上圖的深度為4.

(13)有序樹和無序樹:如果將樹中結點的各子樹看成從左至右是由次序的,則稱該樹的為有序樹,否則為無序樹。

二、什麼是二叉樹?

 2.1  二叉樹是一種特殊的樹,主要有著以下兩個特點:

(1)有且僅有一個稱之為根的結點;

(2)除根結點以外的其餘結點分為兩個互不相交的子集T1和T2,分別稱為T的左子樹和右子樹,且T1和T2本身又都是二叉樹。


2.2 二叉樹的遍歷

三種遍歷方式:

①先序遍歷(根左右)②中序遍歷(左根右)③後序遍歷 (左右根)        (這個面試有問到。)

 (1)先序遍歷:1.訪問根結點  2.先序遍歷左子樹  3.先序遍歷右子樹

如上圖的先序遍歷為:ABDGCEF

(2)中序遍歷:1.中序遍歷左子樹 2.訪問根結點 3.中序遍歷右子樹

如上圖的中序遍歷為:DGBAECF

(3)後序遍歷:1.後序遍歷左子樹 2.後序遍歷右子樹  3.訪問根結點

如上圖的後序遍歷為:GDBEFCA

三、 二叉樹的儲存結構

3.1 ①順序儲存結構  ②鏈式儲存結構

(1)順序儲存結構

實際上就是用一個一維陣列按照自上而下,自左至右的將每一層的結點放入陣列中,

二叉樹的順序儲存表示:

#define MAXSIZE 100
typedef TElemType SqBiTree[MAXSIZE];
SqBiTree bt;

這時候如果你對c的typedef不熟悉的話可能不是很明白上面的這種寫法。實際上這裡用到了typedef定義陣列的方式。

假設為 typedef int sqBiTree[10]  ,SqBiTree bt ,相當於定義一個int bt[10].

如上圖的圖示順序儲存結構差不多是這樣的。


圖畫的很醜將就點看吧,其中0表示為空,我們可以很直觀就可以看出這種儲存方式的弊端,如果二叉樹不是完全二叉樹的話,是會有很大的空間浪費的。這種方式唯一的特點就是比較簡單容易理解,但是實際上,我們很少會使用順序儲存方式,

(2)鏈式儲存方式

實際上就是一個連結串列,連結串列的結點至少得包含三個域:資料域和左右指標域(為了方便找到結點的雙親,還可以在結點的結構中增加一個指向其雙親結點的指標域)

二叉樹的鏈式儲存表示:

typedef struct BiTNode{
  TElemType data;        //結點的資料域
  struct BiTNode *lchild,*rchild; //左右孩子指標
}BiTNode,*BiTree;

把上面的圖複製下來:

3.2 二叉樹的三種遍歷虛擬碼實現(遞推形式)

先序:

void preOrder(BitTree t)      //先序遍歷
{
    if(t)             //樹不為空
    {
        visit(t->data );        //訪問節點資料,自定義訪問函式visit
        preOrder (t->lchild );      //遞迴遍歷左子樹
        preOrder (t->rchild );      //遞迴遍歷右子樹
    }
}

中序:

void inOrder(BitTree t)       //中序遍歷
{ 
    if(t)          //樹不為空
    {
        inOrder (t->lchild );
        visit(t->data );        //訪問節點資料
        inOrder (t->rchild );
    }
}

後序:

void postOrder(BitTree t)     //後序遍歷
{
    if(t)           //樹不為空
    {
        postOrder (t->lchild );
        postOrder (t->rchild );
        visit(t->data );        //訪問節點資料
    }
}

未完待續。

相關推薦

資料結構-平衡(AVL)

背景 不同結構的二叉查詢樹,查詢效率有很大的不同。如何解決這個問題呢?關鍵在於如何最大限度的減小樹的深度。正是基於這個想法,平衡二叉樹出現了。 前言 平衡二叉搜尋樹(英語:Balanced Binary Tree)是一種結構平衡的二叉搜尋樹。 它能在O(log n)時間內完成插入、查詢和

C語言複習資料結構簡單的輸入和輸出操作

C語言複習之簡單的二叉樹的僅輸入輸出操作 1:結構體 typedef struct TreeNode{ _Data value; struct TreeNode * father; struct TreeNode * right; stru

資料結構AVL平衡

平衡二叉樹(Balanced Binary Tree)又被稱為AVL樹(有別於AVL演算法),且具有以下性質:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。這個方案很好的解決了二叉查詢樹退化成連結串列的問題,把插入,查詢,刪除的時間複雜度最

資料結構(下)

上面兩篇我們瞭解了樹的基本概念以及二叉樹的遍歷演算法,還對二叉查詢樹進行了模擬實現。數學表示式求值是程式設計語言編譯中的一個基本問題,表示式求值是棧應用的一個典型案例,表示式分為字首、中綴和字尾三種形式。這裡,我們通過一個四則運算的應用場景,藉助二叉樹來幫助求解表

資料結構

  前幾天被面試官問到了二叉樹,因為沒有去複習所以回答的很糟糕,資料結構是大二的時候學的,在平時的web開發我能用到的機會其實不多,所以也沒有去整理,但是資料結構也是程式的靈魂架構,是需要認真研究的,故在此繼續進行整理複習。  一、什麼是樹?1.1  樹是n(n>=0)

Android版資料結構演算法(六):

/** * 前序遍歷——迭代 * @author Administrator * */ public void preOrder(TreeNode node){ if(node == null){ return;

資料結構開發(23):中結點的查詢、插入、刪除清除操作

0.目錄 1.二叉樹中結點的查詢操作 2.二叉樹中結點的插入操作 3.二叉樹中結點的刪除操作 4.二叉樹中結點的清除操作 5.小結 1.二叉樹中結點的查詢操作 查詢的方式: 基於資料元素值的查詢 BTreeNode<T>* find(const T&

資料結構開發(24):中屬性操作、層次遍歷典型遍歷

0.目錄 1.二叉樹中屬性操作的實現 2.二叉樹結構的層次遍歷 3.二叉樹的典型遍歷方式 4.小結 1.二叉樹中屬性操作的實現 二叉樹的屬性操作: 二叉樹中結點的數目: 定義功能:count(node) 在 node 為根結點的二叉樹中統計結點數目 在

資料結構開發(25):中屬性操作、層次遍歷典型遍歷

0.目錄 1.二叉樹的比較與相加 2.二叉樹的線索化實現 3.二叉樹的經典面試題分析 3.1 單度結點刪除 3.2 中序線索化二叉樹 4.小結 1.二叉樹的比較與相加 二叉樹的克隆操作: SharedPointer< BTree<T> > clone

資料結構演算法】002—(Python)

概念 樹 樹是一類重要的非線性資料結構,是以分支關係定義的層次結構 定義: 樹(tree)是n(n>0)個結點的有限集T,其中: 有且僅有一個特定的結點,稱為樹的根(root) 當n>1時,其餘結點可分為m(m>0)個互不相交的有限集T1,T2,……Tm,其中每一個集合本身又是一棵

資料結構例題

樹與二叉樹例題 例1 高度為K(K>=2)的完全二叉樹至少有()個葉子結點。 解: 根據二叉樹性質 二叉樹第i(i>=1)層上至多有2^(i-1)個結點 第K-1層有 2^(K-1-1)=2^(K-2) 個結點 求二叉樹至少有多

資料結構基礎溫故-4.(下)

上面兩篇我們瞭解了樹的基本概念以及二叉樹的遍歷演算法,還對二叉查詢樹進行了模擬實現。數學表示式求值是程式設計語言編譯中的一個基本問題,表示式求值是棧應用的一個典型案例,表示式分為字首、中綴和字尾三種形式。這裡,我們通過一個四則運算的應用場景,藉助二叉樹來幫助求解表示式的值。首先,將表示式轉換為二叉樹,然後通過

資料結構基礎溫故-4.(中)

在上一篇中,我們瞭解了樹的基本概念以及二叉樹的基本特點和程式碼實現,還用遞迴的方式對二叉樹的三種遍歷演算法進行了程式碼實現。但是,由於遞迴需要系統堆疊,所以空間消耗要比非遞迴程式碼要大很多。而且,如果遞迴深度太大,可能系統撐不住。因此,我們使用非遞迴(這裡主要是迴圈,迴圈方法比遞迴方法快, 因為迴圈避免了一系

資料結構基礎溫故-4.(上)

前面所討論的線性表元素之間都是一對一的關係,今天我們所看到的結構各元素之間卻是一對多的關係。樹在計算機中有著廣泛的應用,甚至在計算機的日常使用中,也可以看到樹形結構的身影,如下圖所示的Windows資源管理器和應用程式的選單都屬於樹形結構。樹形結構是一種典型的非線性結構,除了用於表示相鄰關係外,還可以表示層次

資料結構-

樹的結點: 由一個數據元素及關聯其子樹的邊所組成 樹的路徑: 從根結點到該結點所經歷的結點和分支的順序排列 路徑的長度: 路徑中所包含的分支數 結點的度: 該結點所擁有子樹的數目 樹的度: 樹中所有結點的度的最大值 葉結點: 度為0的結點,也叫終端結點 分支結點: 度不

資料結構自平衡查詢(1)

今天開始,我們再來認識一個新的二叉樹,稱為自平衡二叉查詢樹。AVL樹是最先發明的自平衡二叉查詢樹。 AVL樹的特點是:對於樹中的任何節點,節點的左右子樹的高度差距最大為1,所以AVL樹也稱為高度平衡樹。AVL樹得名於它的發明者G.M. Adelson-Velsky和E.M.

資料結構——的性質,的建立,遍歷,插入,列印,查詢左右兄弟等

#include<iostream> #include<string> #include<stack> using namespace std; #define MAX(x,y) (x) >= (y)?(x):(y) /* 結點的層

資料結構筆記】三、

課程是中國大學MOOC浙江大學出的資料結構。 作為一個數據結構愛好者,我覺得很有必要稍微整理下各章節的筆記,對知識進行梳理。 查詢 首先,老師從“查詢”入手,查詢分為靜態和動態,演示了靜態查詢的例程,並介紹了‘建立哨兵’的思想。而這個例程使用的是普通的順序

資料結構——的遍歷

##目錄 1. 樹 2. 二叉樹 3. 二叉樹的遍歷 4. 總結 5. 參考資料 ## 序 樹是學習資料結構的時候非常重要的一個數據結構,尤其是二叉樹更為重要。像`Java`的`HashMap` 就使用了紅黑樹,而`Mysql`的索引就使用到了B+樹。恰好最近刷`leetcode`碰到了不少的有關 二叉樹的

3、非線性結構--——數據結構【基礎篇】

位置 enter 深度 基礎 表達式 左右 -a 基礎篇 先序遍歷 非線性結構--樹與二叉樹 二叉樹的基礎知識:         二叉樹的特點:             1、每個結點的度<=2             2、二叉樹是有序樹         二叉樹的五種不