二叉樹是很有用的一種資料結構,遍歷則是其基本操作,這裡列出實是保證完整性。幾個備用的結構定義和函式:
//二叉樹節點定義
class treenodeelement
;typedef treenodeelement* treenode;
//遞迴實現(visit)
void visit(treenode node)
二叉樹中序遍歷的遞迴和非遞迴實現:
//遞迴遍歷
void binretriveatree(treenode root,void (* visit)(treenode))
}//非遞迴遍歷,新增#include
void binretriveatreewithoutrecurve(treenode root,void (* visit)(treenode))
if (!tree.empty())}}
二叉樹前序遍歷的遞迴和非遞迴實現:
//遞迴遍歷
void preretriveatree(treenode root,void (* visit)(treenode))}//
非遞迴遍歷,新增
#include
void preretriveatreewithoutrecurve(treenode root,void (* visit)(treenode))
if (tmp->_l != null)}}
二叉樹是很有用的一種資料結構,遍歷則是其基本操作,這裡列出實是保證完整性。二叉樹後序遍歷的非遞迴遍歷中當當前節點存在右子樹的時候需要先遍歷右子樹,因此要對二叉樹的節點定義中新增_tag域,標誌當前節點右子樹是否已經遍歷,備用的結構定義和函式:
//二叉樹節點定義
class treenodeelement
public:
treenodeelement();
treenodeelement(int value);
treenodeelement(int value,treenodeelement* l,treenodeelement* r);
~treenodeelement();
private:
public:
int _value;
treenodeelement* _l;
treenodeelement* _r;
bool _tag;
typedef treenodeelement* treenode;
//建構函式的定義,前序和中序中相似,只是不學要_tag域
treenodeelement::treenodeelement()
_value = -1;
_l = null;
_r = null;
_tag = false;
treenodeelement::treenodeelement(int value)
_value = value;
_l = null;
_r = null;
_tag = false;
treenodeelement::treenodeelement(int value,treenodeelement* l,treenodeelement* r)
_value = value;
_l = l;
_r = r;
_tag = false;
treenodeelement::~treenodeelement()
delete _l;
delete _r;
//遞迴實現(visit)
void visit(treenode node)
cout<_value<<" ";
二叉樹後序遍歷的遞迴和非遞迴實現:
//遞迴遍歷
void postretriveatree(treenode root,void (* visit)(treenode))
if (root)
postretriveatree(root->_l,visit);
postretriveatree(root->_r,visit);
(*visit)(root);
//非遞迴遍歷,新增#include
void postretriveatreewithoutrecurve(treenode root,void (* visit)(treenode))
stacktree;
while ((root != null) || (!tree.empty()))
while (root != null)
tree.push(root);
root = root->_l;
if (!tree.empty())
root = tree.top();
if (root->_tag) //可以訪問
visit(root);
tree.pop();
root = null; //第二次訪問標誌其右子樹也已經遍歷
else
root->_tag = true;
root = root->_r;
怎樣從頂部開始逐層列印二叉樹結點資料?請程式設計。這個題目實際上很簡單,採用佇列的方式很容易可以實現:
void hiberarchyretriveatree(treenode root,void (* visit)(treenode))
}這裡用到節點訪問的策略,簡單可以實現為:
void visit(treenode node)
構建二叉樹 遍歷二叉樹
陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...
二叉樹遍歷
二叉樹的遍歷非常重要,但對已一棵比較複雜的樹,要寫出它的先 中 後序遍歷,往往不是那麼簡單,也很容易犯錯。這裡介紹一種比較直觀且不容易犯錯的方法。對於圖1所示的二叉樹,要寫出它的先 中 後序遍歷,往往很容易出錯。圖 1 其實,我們可以用圖2中的紅線描畫出二叉樹的輪廓。圖 2 而對於樹上的每乙個節點,...
二叉樹遍歷
描述 華為實習生招聘,有一道類似如下的題目 給出二叉樹,如圖1所示 圖 1 二叉樹 要求給出中序遍歷的結果。下面分別就前序遍歷 中序遍歷 後序遍歷進行分析。規律 前序遍歷 根在前 子樹在根後且左子樹比右子樹靠前 中序遍歷 根在中 左子樹在根左邊,右子樹在根右邊 後序遍歷 根在後 子樹在根前且左子樹比...