二叉樹的遍歷是指按照一定次序訪問二叉樹中的所有節點,且每個節點僅被訪問一次的過程。是最基本的運算,是其他運算的基礎。
二叉樹有兩種儲存結構:順序儲存和鏈式儲存
順序儲存:(對完全二叉樹來說,可以充分利用儲存空間,但對於一般的二叉樹,只有少數的儲存單元被利用)
[cpp]view plain
copy
typedef
struct
sqbtree;
鏈式儲存:
[csharp]view plain
copy
typedef
struct
node
btnode;
二叉樹三種遞迴的遍歷方法:
先序遍歷
訪問根節點→先序遍歷左子樹→先序遍歷右子樹
中序遍歷
中序遍歷左子樹→訪問根節點→中序遍歷右子樹
後序遍歷
後序遍歷左子樹→後序遍歷右子樹→訪問根節點
二叉樹遍歷的遞迴演算法:
[cpp]view plain
copy
void
preorder(btnode *b)
//先序遍歷遞迴演算法
} void
inorder(btnode *b)
//中序遍歷遞迴演算法
} void
postorder(btnode *b)
//後序遍歷遞迴演算法
} 二叉樹非遞迴遍歷演算法:
有兩種方法:①用棧儲存資訊的方法 ②增加指向父節點的指標的方法 暫時只介紹下棧的方法
先序遍歷:
[cpp]view plain
copy
void
preorder(btnode *b)
else
} }
中序遍歷:
[cpp]view plain
copy
void
inorder(btnode *b)
if(!s.empty())
} }
後序遍歷:
[cpp]view plain
copy
void
postorder(btnode *b)
while
(!s.empty())
else
if(node->left!=null)
node->bpushed=true
; //如果標識位為true,則表示入棧
}
} }
層次遍歷演算法:(用佇列的方法)
[cpp]view plain
copy
void
levelorder(btnode *b)
if(null!=right)
} }""
>
已知先序和中序求後序的演算法:(已知後序和中序求先序的演算法類似,但已知先序和後序無法求出中序)
[cpp]view plain
copy
intfind(
char
c,char
a,int
s,int
e) /* 找出中序中根的位置。 */
/* 其中pre表示先序序,pre_s為先序的起始位置,pre_e為先序的終止位置。 */
/* 其中in表示中序,in_s為中序的起始位置,in_e為中序的終止位置。 */
/* pronum()求出pre[pre_s~pre_e]、in[in_s~in_e]構成的後序序列。 */
void
pronum(
char
pre,
intpre_s,
intpre_e,
char
in,int
in_s,
intin_e)
c=pre[pre_s]; /* c儲存根節點。 */
k=find(c,in,in_s,in_e); /* 在中序中找出根節點的位置。 */
pronum(pre,pre_s+1,pre_s+k-in_s,in,in_s,k-1); /* 遞迴求解分割的左子樹。 */
pronum(pre,pre_s+k-in_s+1,pre_e,in,k+1,in_e); /* 遞迴求解分割的右子樹。 */
printf("%c"
,c);
/* 根節點輸出。 */
} main()
二叉樹 各種遍歷演算法
include include include using namespace std 二叉樹結點 typedef struct bitnodebitnode,bitree 按先序序列建立二叉樹 int createbitree bitree t else return 0 輸出 void visi...
二叉樹的各種遍歷演算法
typedef struct treenode int data struct treenode left struct treenode right int flag 該標記用於後序非遞迴遍歷 ptree 先序遞迴遍歷 void bt preorder ptree root if root nul...
演算法之二叉樹各種遍歷
樹形結構是一類重要的非線性資料結構,其中以樹和二叉樹最為常用。二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹常被用作二叉查詢樹和二叉堆或是二叉排序樹。二叉樹的每個結點至多只有二棵子樹 不存在度大於2的結點 ...