資料結構c語言二叉樹的遍歷
樹形結構是一類重要的非線性資料結構,其中以樹和二叉樹最為常用。
二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用作二叉查詢樹和二叉堆或是二叉排序樹。二叉樹的每個結點至多只有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2的 i -1次方個結點;深度為k的二叉樹至多有2^(k) -1個結點;對任何一棵二叉樹t,如果其終端結點數(即葉子結點數)為n0,度為2的結點數為n2,則n0 = n2 + 1。
二叉樹的鏈式儲存結構是一類重要的資料結構,其形式定義如下:
[cpp]view plain
copy
//二叉樹結點
typedef
struct
bitnodebitnode,*bitree;
二叉樹的建立:
通過讀入乙個字串,建立二叉樹的演算法如下:
[cpp]view plain
copy
//按先序序列建立二叉樹
intcreatebitree(bitree &t)
else
return
0;
}
二叉樹的遍歷:
遍歷是對樹的一種最基本的運算,所謂遍歷二叉樹,就是按一定的規則和順序走遍二叉樹的所有結點,使每乙個結點都被訪問一次,而且只被訪問一次。由於二叉樹是非線性結構,因此,樹的遍歷實質上是將二叉樹的各個結點轉換成為乙個線性序列來表示。
遞迴演算法:
[cpp]view plain
copy
//輸出
void
visit(bitree t)
} //先序遍歷
void
preorder(bitree t)
} //中序遍歷
void
inorder(bitree t)
} //後序遍歷
void
postorder(bitree t)
}
非遞迴演算法:
<1>先序遍歷:
【思路】:訪問t->data後,將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,再先序遍歷t的右子樹。
[cpp]view plain
copy
/* 先序遍歷(非遞迴)
思路:訪問t->data後,將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,再先序遍歷t的右子樹。
*/void
preorder2(bitree t)
else
}//while
}
<2>中序遍歷
【思路】:t是要遍歷樹的根指標,中序遍歷要求在遍歷完左子樹後,訪問根,再遍歷右子樹。
先將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,訪問t->data,再中序遍歷t的右子樹。
[cpp]view plain
copy
void
inorder2(bitree t)
else
}//while
}
<3>後序遍歷
【思路】:t是要遍歷樹的根指標,後序遍歷要求在遍歷完左右子樹後,再訪問根。需要判斷根結點的左右子樹是否均遍歷過。
[cpp]view plain
copy
//後序遍歷(非遞迴)
typedef
struct
bitnodepostbitnodepost,*bitreepost;
void
postorder2(bitree t)
//左右子樹訪問完畢訪問根節點
while
(!stack.empty() && (stack.top())->tag ==
'r')
//遍歷右子樹
if(!stack.empty())
}//while
}
<4>層次遍歷
【思路】:按從頂向下,從左至右的順序來逐層訪問每個節點,層次遍歷的過程中需要用佇列。
[cpp]view plain
copy
//層次遍歷
void
levelorder(bitree t)
//右子樹不空,將右子樹入隊
if(p->rchild != null)
} }
測試用例:
輸入:abc##de#g##f###
輸出:
**:[cpp]view plain
copy
#include
#include
#include
using
namespace
std;
//二叉樹結點
typedef
struct
bitnodebitnode,*bitree;
//按先序序列建立二叉樹
intcreatebitree(bitree &t)
else
return
0;
} //輸出
void
visit(bitree t)
} //先序遍歷
void
preorder(bitree t)
} //中序遍歷
void
inorder(bitree t)
}
//後序遍歷
void
postorder(bitree t)
} /* 先序遍歷(非遞迴)
思路:訪問t->data後,將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,再先序遍歷t的右子樹。
*/void
preorder2(bitree t)
else
}//while
} /* 中序遍歷(非遞迴)
思路:t是要遍歷樹的根指標,中序遍歷要求在遍歷完左子樹後,訪問根,再遍歷右子樹。
先將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,訪問t->data,再中序遍歷t的右子樹。
*/void
inorder2(bitree t)
else
}//while
} //後序遍歷(非遞迴)
typedef
struct
bitnodepostbitnodepost,*bitreepost;
void
postorder2(bitree t)
//左右子樹訪問完畢訪問根節點
while
(!stack.empty() && (stack.top())->tag ==
'r')
//遍歷右子樹
if(!stack.empty())
}//while
} //層次遍歷
void
levelorder(bitree t)
//右子樹不空,將右子樹入隊
if(p->rchild != null)
} }
intmain()
mysql 遍歷二叉樹 資料結構 二叉樹遍歷
這篇博文主要是研究二叉樹遍歷的遞迴與非遞迴演算法,有興趣的小夥伴可以了解下!二叉樹的遞迴遍歷 深度優先遍歷 先來張圖,看看各結點遍歷時的情況 二叉樹深度優先遍歷總結 分別為第一次,第二次,第三次進入某個結點 先序遍歷 先訪問根結點,然後先序遍歷左子樹,最後先序遍歷右子樹 根 左 右 中序遍歷 先中序...
資料結構 遍歷二叉樹
資料結構實驗之二叉樹二 遍歷二叉樹 time limit 1000ms memory limit 65536kb submit statistic problem description 已知二叉樹的乙個按先序遍歷輸入的字串行,如abc,de,g,f,其中,表示空結點 請建立二叉樹並按中序和後序的方...
資料結構 遍歷二叉樹
二叉樹的遍歷原理 二叉樹的遍歷是指從根節點出發,按照某種次序以此訪問二叉樹所有節點,使得每個節點被訪問一次且僅被訪問一次 二叉樹遍歷方法 1.前序遍歷 規則是若二叉樹為空,則空操作返回,否則先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹 2.中序遍歷 規則是若樹為空,則空操作返回,否則從根節點開...