「怎麼遍歷乙個二叉樹?」
二又樹的遍歷是指按某條搜尋路徑訪問樹中每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。
由於二叉樹是一種非線性結構,每個結點都可能有兩棵子樹,因而需要尋找一種規律,以便使二叉樹上的結點能排列在乙個線性佇列上,進而便於遍歷。
總共有四種遍歷方法:先序遍歷,中序遍歷,後序遍歷,層次遍歷。
先序遍歷、中序遍歷、後序遍歷,
他們的遞迴演算法非常像,而且也非常簡潔。
但是非遞迴演算法就有點不同,特別是後序遍歷,麻煩得多。
考試的時候如果寫演算法題,
乙個遞迴演算法整上去完事了,
要整非遞迴演算法主要是為了以防萬一,萬一考到了臨時想,是很費勁的。
一棵b樹的結構如下:
#define maxsize 100typedef char elemtype;typedef struct node btnode;
先序遍歷
先序遍歷(preorder)的操作過程如下。
若二叉樹為空,則什麼也不做,
若二叉樹非空,則,
1)、訪問根結點;
2)、先序遍歷左子樹;
3)、先序遍歷右子樹。
這裡先給出遞迴的演算法,非遞迴的演算法我們在另外說。
void preorder(btnode *b) //先序遍歷的遞迴演算法}
中序遍歷
中序遍歷(inorder)的操作過程如下。
若二叉樹為空,則什麼也不做,
若二叉樹非空,則,
1)、中序遍歷左子樹;
2)、訪問根結點;
3)、中序遍歷右子樹。
void inorder(btnode *b) //中序遍歷的遞迴演算法}
後序遍歷
後序遍歷(postorder)的操作過程如下。
若二叉樹為空,則什麼也不做,
若二叉樹非空,則,1)、後序遍歷左子樹;
2)、後序遍歷右子樹;
3)、訪問根結點。
void postorder(btnode *b) //後序遍歷的遞迴演算法}
層次遍歷
層次遍歷的思路和先序遍歷、中序遍歷、後序遍歷不太一樣,
它是按照層級來進行遍歷的,
先遍歷第一層的所有節點,再遍歷第二層的所有結點,依次類推。
要以遞迴方式實現層次遍歷,
需要先定義乙個順序佇列:
typedef struct sqqueue; //順序隊型別
為了方便演算法的實現,
我們需要實現順序佇列的初始化、出隊、入隊操作。
void initqueue(sqqueue *&q) //初始化佇列void destroyqueue(sqqueue *&q) //銷毀佇列bool queueempty(sqqueue *q) //判斷佇列是否為空bool enqueue(sqqueue *&q,btnode *e) //進佇列bool dequeue(sqqueue *&q,btnode *&e) //出佇列
佇列的方法已經搞定了,接下來就開始層次遍歷噢~
void levelorder(btnode *b) }
大概的演算法過程就是:
先將二叉樹根結點入隊,然後出隊,訪問出隊結點,若它有左子樹,則將左子樹根結點入隊;若它有右子樹,則將右子樹根結點入隊。然後出隊,訪問出隊結點……如此反覆,直至隊列為空。
如果覺得有用,不點個再看麼少年?↓
~( ̄▽ ̄)~*
二叉樹初始化 C 二叉樹的初始化
基本知識 指標,結構體,遞迴 結構體 左兒子,右兒子,值 實現方法 1.定義乙個結構體指標 2.進行以下迴圈 a.輸入節點值 以char型舉例 b.若為 此時為葉節點,返回 c.若不為 則用new為指標宣告空間,並從a開始對左,右兒子進行遞迴操作 include using namespace st...
資料結構 二叉樹 反轉二叉樹
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 ...
二叉樹13 平衡二叉樹
題目 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。思路 所謂平衡二叉樹是指空樹或者任意結點的2棵子樹的高度差不差過1的樹。要判斷以root為根的樹是否是一棵平衡二叉樹,需要先判斷以root.left為根的子樹和以root.right為根的子樹是否是平衡二叉樹,如果有某一棵子樹不是平衡二叉樹那麼整棵...