資料結構 二叉樹的遍歷詳解

2021-10-03 12:20:47 字數 2676 閱讀 5438

之前寫了一篇關於二叉樹的概要介紹,裡面包括了二叉樹的建立等相關**,這一篇文章主要來詳細的對二叉樹的建立講解一下~

參考之前的文章二叉樹的概要介紹

首先,定義一下關於二叉樹的結點資訊

typedef struct btnode

btnode, *binarytree;

這是篇文章所要分析的樹

接下來進入正題,我們首先為大家呈現的是

1、二叉樹的遞迴中序遍歷

void inoder(struct btnode* p)

}

2、二叉樹的遞迴先序遍歷

void preoder(struct btnode* p)

}

3、二叉數的遞迴後續遍歷

void lsoder(struct btnode* p)

}

實現原理:

首先進入迴圈,遞迴進入結點a的左子樹b;再遞迴進入結點b的左子樹c;結點c的左子樹為空,則列印結點c,回退到結點b,列印b;接著遞迴進入結點b的右子樹d,結點d的左子樹為空,列印結點d,回退到結點b;b的遞迴完成,回退到a,列印結點a…依次類推。

1、非遞迴中序遍歷

void niceinorder(struct btnode* ptr)

ptr = st.top(); st.pop();

cout << ptr->data << " ";

ptr = ptr->rightchild;

} cout << endl;

}

本**的關鍵在於while (!st.empty() || ptr != null)這個迴圈。因為當我們把c入棧過後它的ptr為空,但是這時的棧並不為空,所以再次進入迴圈;

當把a出棧過後,因為ptr右子樹還有沒有遍歷到的結點,所以ptr != null進入迴圈,迴圈操作。

2、非遞迴後序遍歷

特點:該結點的左邊訪問完了右邊訪問完了才應該列印該結點

所以要有乙個標記結點來判定右子樹有被訪問過沒有,如果訪問過了就列印該結點。

void nicepastorder(struct btnode* ptr)

ptr = st.top(); st.pop();

if (ptr->rightchild == null || ptr->rightchild == tag)

else

}cout << endl;

}

3、非遞迴前序遍歷前序遍歷只需要先把右子樹入棧再把左子樹入棧,最後列印即可

1、非遞迴後序遍歷用數字標記結點入棧次數

struct stknode

};void stknicepastorder(struct btnode* ptr)

else

else if (node.popnum == 2 && node.pnode->rightchild != null)

}} cout << endl;

}

2、非遞迴中序遍歷

佇列實現。根結點入隊,佇列不為空就列印,再依次入隊左右節點

乙個棧乙個佇列共同實現

void levelorder2(struct btnode* ptr)

if (ptr->leftchild != null)

}while (!qub.empty())

if (ptr->leftchild != null)

}} cout << endl;

}

mysql 遍歷二叉樹 資料結構 二叉樹遍歷

這篇博文主要是研究二叉樹遍歷的遞迴與非遞迴演算法,有興趣的小夥伴可以了解下!二叉樹的遞迴遍歷 深度優先遍歷 先來張圖,看看各結點遍歷時的情況 二叉樹深度優先遍歷總結 分別為第一次,第二次,第三次進入某個結點 先序遍歷 先訪問根結點,然後先序遍歷左子樹,最後先序遍歷右子樹 根 左 右 中序遍歷 先中序...

資料結構 遍歷二叉樹

資料結構實驗之二叉樹二 遍歷二叉樹 time limit 1000ms memory limit 65536kb submit statistic problem description 已知二叉樹的乙個按先序遍歷輸入的字串行,如abc,de,g,f,其中,表示空結點 請建立二叉樹並按中序和後序的方...

資料結構 遍歷二叉樹

二叉樹的遍歷原理 二叉樹的遍歷是指從根節點出發,按照某種次序以此訪問二叉樹所有節點,使得每個節點被訪問一次且僅被訪問一次 二叉樹遍歷方法 1.前序遍歷 規則是若二叉樹為空,則空操作返回,否則先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹 2.中序遍歷 規則是若樹為空,則空操作返回,否則從根節點開...