樹和二叉樹 順序和鏈式)的遍歷操作

2021-09-29 08:00:14 字數 3824 閱讀 8251

樹:

n個結點的有限集合,當n等於0時為空樹。

任意一棵非空樹滿足以下條件:

⑴ 有且僅有乙個特定的稱為根的結點;

⑵ 當n>1時,除根結點之外的其餘結點被分成m(m>0)個互不相交的有限集合t1,t2,… ,tm,其中每個集合又是一棵樹,並稱為這個根結點的子樹。

樹的定義採用遞迴方法。

結點的度:結點所擁有子樹的個數

樹的度:樹中各結點度的最大值

葉子結點:度為0的結點

分支節點:度不為零的結點

結點所在層數:根結點的層數為1;對其餘任何結點,若某結點在第k層,則其孩子結點在第k+1層。

樹的深度:樹中所有結點的最大層數,也稱高度

重點:二叉樹:

二叉樹是n(n≥0)個結點的有限集合,該集合或者為空集(稱為空二叉樹),或者由乙個根結點和兩棵互不相交的、分別稱為根結點的左子樹和右子樹的二叉樹組成。

二叉樹的結點度數最大為2,二叉樹是有序的。

特殊的二叉樹:滿二叉樹

在一棵二叉樹中,如果所有分支結點都存在左子樹和右子樹,並且所有葉子都在同一層上。

特點:葉子只能出現在最下層,只有度為0和度為2的結點。

滿二叉樹在同樣深度的二叉樹中結點個數最多

滿二叉樹在同樣深度的二叉樹中葉子結點個

完全二叉樹:

在滿二叉樹中,從最後乙個結點開始,連續去掉任意個結點,即是一棵完全二叉樹。

特點:1:葉子結點只能出現在最下兩層,且最下層的葉子結點都集中在二叉樹的左部;

2. 完全二叉樹中如果有度為1的結點,只可能有乙個,且該結點只有左孩子。

3. 深度為k的完全二叉樹在k-1層上一定是滿二叉樹。

二叉樹的基本性質

1:二叉樹的第i層上最多有2i-1個結點(i≥1)

2:一棵深度為k的二叉樹中,最多有2k-1個結點,最少有k個結點。

3:在一棵二叉樹中,如果葉子結點數為n0,度為2的結點數為n2,則有: n0=n2+1.

結點總數:n=n0+n1+n2,樹枝數b=n-1,b=n1+2*n2.

4:具有n個結點的完全二叉樹的深度為 [log2n] (向下取整) +1。

對一棵具有n個結點的完全二叉樹中從1開始按層序編號,則

結點i的雙親結點為 i/2;

結點i的左孩子為2i;

結點i的右孩子為2i+1。

== 二叉樹的遍歷操縱:==

前序遍歷

若二叉樹為空,則空操作返回;否則:

①訪問根結點;

②前序遍歷根結點的左子樹;

③前序遍歷根結點的右子樹。

中序遍歷

若二叉樹為空,則空操作返回;否則:

①中序遍歷根結點的左子樹;

②訪問根結點;

③中序遍歷根結點的右子樹。

後序遍歷

若二叉樹為空,則空操作返回;否則:

①後序遍歷根結點的左子樹;

②後序遍歷根結點的右子樹。

③訪問根結點;

層序遍歷

二叉樹的層次遍歷是指從二叉樹的第一層(即根結點)開始,從上至下逐層遍歷,在同一層中,則按從左到右的順序對結點逐個訪問。

二叉樹的順序儲存:

二叉樹的順序儲存結構就是用一維陣列儲存二叉樹中的結點,並且結點的儲存位置(下標)應能體現結點之間的邏輯關係——父子關係。

完全二叉樹和滿二叉樹中結點的序號可以唯一地反映出結點之間的邏輯關係。

二叉樹的順序儲存:

按照完全二叉樹編號,然後以編號為陣列下標進行儲存,如果改編號下沒有元素,則儲存 『\0』。 這樣就能體現結點之間的父子關係。

知道二叉樹的前序遍歷和中序遍歷可以確定乙個二叉樹

用遞迴方法來實現前序遍歷:

void preorder(int root, char data)

return ;}

中序遍歷

void inorder(int root, char data)

return;

}後序遍歷

void postorder(int root, char data);

template class bitree

void inorder()

void postorder()

void levelorder();

private:

binode*root;

binode* creat( );

void release(binode*root);

void preorder(binode*root);

void inorder(binode*root);

void postorder(binode*root);

void levelorder(binode*root);

};

前序遍歷-遞迴演算法

template   void   bitree::preorder(binode*root) 

}

前序遍歷-非遞迴演算法-用棧來實現

template void bitree::preorder(binode*root) 

if (!s.empty())

}}

中序遍歷-遞迴演算法

template void bitree::inorder (binode*root)

}

中序遍歷-非遞迴演算法-用棧來實現

template void bitree::inorderwithoutd (binode*root)

if(!astack.empty())

}}

二叉樹的建立

templatebitree::bitree( )

template void bitree::creat(binode* &root )

}

後序遍歷-遞迴演算法

template void bitree::postorder(binode*root)

}

後序遍歷-非遞迴演算法

void tree::t_print(binode*bt)

else

}}

層序遍歷-用佇列來實現

templatevoid bitree::levelorder(binode* root)//end while

}

二叉樹的析構

templatevoid bitree::release(binode* root)  

}templatebitree::~bitree(void)

二叉樹的遍歷和線索二叉樹

二叉樹的遍歷,所謂二叉樹的遍歷,是指按某條搜尋路徑訪問樹中的每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。由二叉樹的遞迴定義可知,遍歷一棵二叉樹便要決定對根結點n,左子樹l和右子樹r的訪問順序。按照先遍歷再遍歷右子樹的原則,常見的遍歷次序有先,中,後三種遍歷方法,其中序指的是根結點再何時被訪...

二叉樹的遍歷和線索二叉樹

1 遍歷二叉樹 以一定的規則將二叉樹的結點排列成乙個線性序列。2 線索二叉樹 實質就是遍歷一次二叉樹,從而充分利用傳統二叉鍊錶中的空指標,不浪費儲存空間。目的在於利用線索二叉樹可以加快查詢結點的前驅和後繼的速度。3 先序和中序 後序和中序 層序和中序 可以確定唯 一 一 顆二叉樹。只知道先序和後序,...

二叉樹的遍歷和線索二叉樹

void preorder bitree t void inorder bitree t void postorder bitree t void preordertr erse bitree t else void inordertr erse bitree t else 後序非遞迴遍歷二叉樹的順...