二叉樹也稱二分樹,是有限的節點集合,這個集合或者是空,或者是由乙個根節點和兩棵互不相交的稱為左子樹和右子樹的二叉樹組成。
二叉樹結構簡單,儲存效率高,運算演算法也相對簡單,而且任何m次樹都可以轉化為二叉樹結構。因此二叉樹具有很重要的地位。
二叉樹和
2次樹的區別,對於非空樹:1、二次樹中至少有乙個節點的度為2,二叉樹沒有此要求2、二次樹不區分左、右子樹,二叉樹嚴格區分左、右子樹。
二叉樹5種基本形態:1.空二叉樹2.單節點二叉樹3.右子樹為空的二叉樹4.左子樹為空的二叉樹5.左右子樹都不為空的二叉樹。
二叉樹
adt、表示方法、術語均與樹一致。
在一棵二叉樹中,如果所有分支節點都有左孩子節點和右孩子節點,並且葉子節點都集中在二叉樹的最下一層,這樣的二叉樹稱為滿二叉樹。或一顆高度為h且有2h-1個節點的二叉樹稱為滿二叉樹。可以對二叉樹的節點進行層序編號,約定編號從樹根為1開始,按層數從小到大,同一層從左到右的次序進行。
若二叉樹中最多只有最下面兩層的節點的度小於2,並且最下面一層的葉子節點都依次排列在該層最左邊的位置上,則這樣的二叉樹稱為完全二叉樹。滿二叉樹是完全二叉樹的特例。
完全二叉樹特點:
葉子節點只可能在層次最大的兩層上出現
對於最大層次中的葉子節點,都依次排列在該層最左邊的位置上
若有度為1的節點,只可能有乙個,且該節點只有左孩子而無右孩子
按層序編號後,一旦出現某編號為i的節點,為葉子節點或只有左孩子,則編號大於i的節點均為葉子節點
當節點總數n為奇數時,度為1的節點個數n1=0,當節點總數n為偶數時,n1=1
二叉樹性質:
非空二叉樹上葉子節點數等於雙分支節點數加1
非空二叉樹上第i層上至多有2i-1個節點(i≥1)
高度為h的二叉樹至多有2h-1個節點(h≥1)
對完全二叉樹中編號為i的節點(1≤i≤n
,n≥1,n
為節點數)有:
若i≤(n/2)
向下取整(即
2i≤n)
,則編號為
i的節點為分支節點,否則為葉子節點。
若n為奇數,則沒有單分支節點,若為偶數,則編號最大的分支節點(n/2)只有左孩子節點,沒有右孩子節點。
若編號為i的節點有左孩子節點,則左孩子節點的編號為2i;若編號為i的節點有右孩子節點,則右孩子節點的編號為2i+1。
除樹根節點外,若乙個節點的編號為i,則它的雙親節點的編號為i/2向下取整。
具有n個(n>0)節點的完全二叉樹的高度為log2(n+1)向上取整,或log2(n)向下取整+1
二叉樹與樹、森林之間的轉化:樹、森林與二叉樹之間有乙個自然的對應關係,它們之間可以進行相互轉換。因此可以把樹中處理的問題對應到二叉樹中進行處理,從而使問題簡單化。由於樹中節點左右次序無關緊要,但二叉樹左右孩子節點不能隨意顛倒,因此把一般樹作為有序樹來處理,以免引起混亂。
森林、樹轉換為二叉樹:
若森林t=是m(m≥0)棵樹的序列,則與t相對應的二叉樹β(t)的構造方法如下:
如果m=0,則β(t)為空二叉樹。
如果m>0,則β(t)的根節點為t1的根節點,β(t)根節點的左子樹為β(t1,1,t1,2,…, t1,r),其中t1,1,t1,2,…, t1,r是t1的子樹;β(t)根節點的右子樹為β(t2,t3,…,tm)。
此方法是一種遞迴構造方法,如果假定t是有序樹的序列,那麼由t所構造的二叉樹β(t)是唯一的。
該方法構造的二叉樹β(t)的節點與原來樹t的節點的關係為:二叉樹β(t)的任意節點k,若有左孩子節點,則該左孩子節點為k原來的最左邊(第一棵)子樹的根節點;若有右孩子位元組,則該右孩子節點為k原來的右邊相鄰的第乙個兄弟節點或右邊第一棵相鄰的樹的根節點(當k為原森林中樹的根節點時)。由此可以把遞迴構造二叉樹β(t)的過程歸納如下:
在所有相鄰兄弟節點(森林中每棵樹的根節點可看成是兄弟節點)之間加一條水平連線。
對每個非葉子節點k,除了其最左邊的孩子節點外,刪去k與其他孩子節點的連線。
所有水平線段以左邊節點為軸心順時針旋轉45°。
通過以上步驟,原來的森林就轉換為一棵二叉樹。一棵樹是森林中的特殊情況,由一棵樹轉換的二叉樹的根節點的右孩子節點始終為空,原因是一棵樹的根節點不存在兄弟節點和相鄰的樹。
二叉樹中左孩子節點表示原先樹中的孩子關係,右孩子節點表示兄弟關係。
二叉樹還原為森林、樹:
若β(t)是一棵二叉樹,把β(t)還原為相對應的m(m≥0)棵樹序列構成的森林t=的方法如下:
如果β(t)為空二叉樹,則t為空(m=0)。
如果β(t)為非空二叉樹,則t中的第一棵樹t1的根節點為β(t)的根節點;t1中根節點的子樹序列是由β(t)左子樹還原而成的森林;t中除t1外的其餘樹組成的序列是由β(t)右子樹還原而成的森林。
將由森林或一棵樹轉換而來的二叉樹還原為森林或一棵樹的過程如下:
對於一棵二叉樹中任一節點k1,沿著k1右孩子節點的右子樹方向搜尋所有右孩子結點,即搜尋節點序列k2,k3,…,km,其中ki+1為ki的右孩子節點(1≤i),km沒有右孩子節點。
刪去k1,k2,…,km,之間的連線。
若k1有雙親節點k,則連線k與ki(2≤i≤m)。
將圖形規整化,使各節點按層次排列。
若二叉樹根節點有m個右孩子節點,則還原成森林時有m+1棵樹。
二叉樹儲存結構:
二叉樹的儲存結構主要有順序儲存結構和鏈式儲存結構兩種。
因此必須確定好樹中各資料元素的存放次序,使得各資料元素的相互位置能反映出資料元素之間的邏輯關係。
存放次序是:對該樹中每個節點進行編號,其編號從小到大的順序就是節點存放在連續儲存單元的先後次序。若把二叉樹儲存到一維陣列中,則該編號就是下標值加1(當陣列的起始下標為0)。樹中各節點的編號與等高度的完全二叉樹中對應位置上節點的編號相同。其編號過程是:首先把樹根節點的編號定為1,然後按照從上到下、從左到右的順序,對每一節點進行編號。當某節點是編號為i的雙親節點的左孩子節點時,則它的編號應為2i;當它是右孩子節點時,則它的編號應為2i+1。
根據二叉樹性質,訪問二叉樹的雙親節點和左右孩子節點都非常方便。
順序結構型別定義如下:typedef elemtype sqbtree[maxsize];
其中elemtype為二叉樹中節點值的型別,當二叉樹中某節點為空節點或無效節點(不存在該編號的節點)時,對應位置的值用特殊值(「#」)表示。
順序儲存結構適用於完全二叉樹,對於退化的二叉樹(每個分支節點都是單分支的),空間浪費十分嚴重,且插入刪除等運算十分不方便。
鏈式儲存結構(二叉鏈):用乙個鍊錶來儲存一棵二叉樹,二叉樹中每乙個節點用鍊錶中乙個鏈節點來儲存。節點結構:lchild data rchild
其中data表示值域,用於儲存節點的資料元素,lchild和rchild分別表示左指標域和右指標域,分別用於儲存左孩子節點和右孩子節點的儲存位置。
二叉樹基本運算:建立,按值查詢節點,查詢孩子節點,求高度,輸出
二叉樹遍歷:二叉樹遍歷是指按照一定次序訪問二叉樹中所有節點,並且每個節點僅訪問一次的過程,它是最基本的運算,是二叉樹中所有其他運算的基礎。
先序遍歷過程:訪問根節點,先序遍歷左子樹,先序遍歷右子樹。
中序遍歷過程:中序遍歷左子樹,訪問根節點,中序遍歷右子樹。
後序遍歷過程:後序遍歷左子樹,後序遍歷右子樹,訪問根節點。
層次遍歷過程:訪問根節點(第1層),從左到右訪問第2層所有節點,至最後一層訪問完。
二叉樹構造:假設二叉樹中每個節點的值均不相同,同一棵二叉樹具有唯一的先序序列、中序序列和後序序列,但不同的二叉樹可能具有相同的先序序列、中序序列、後序序列。顯然,僅由乙個先序(中序、後序)序列,無法確定這棵二叉樹的樹形。但若知道先序、中序或者中序、後序序列,即可確定該樹樹形。同時知道先序和後序無法確定樹形。
定理1:任何n(n≥0)個不同節點的二叉樹,都可由它的中序序列和先序序列唯一確定。
實際上,先序序列作用是確定一棵二叉樹的根節點(其第乙個元素即為根節點),中序序列的作用是確定左、右子樹的中序序列(包括確定其各自的節點個數),進而確定左、右子樹的先序序列。
定理2:任何n(n≥0)個不同節點的二叉樹,都可由它的中序序列和後序序列唯一確定。
資料結構10 二叉樹專題
二叉樹實現插入節點 查詢節點 刪除節點 前序遍歷 中序遍歷 後序遍歷。package ch13 二叉樹類 public class tree else else 查詢節點 param value public node find long value else 如果查詢不到 if current n...
資料結構之二叉樹知識
樹是一種重要的非線性資料結構,直觀地看,它是資料元素 在樹中稱為結點 按分支關係組織起來的結構,很象自然界中的樹那樣。樹結構在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構都可用樹形象表示。樹在計算機領域中也得到廣泛應用,如在編譯源程式如下時,可用樹表示源源程式如下的語法結構。又如在資料庫系...
資料結構 二叉樹 反轉二叉樹
include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...