之前寫了一篇關於二叉樹的概要介紹,裡面包括了二叉樹的建立等相關**,這一篇文章主要來詳細的對二叉樹的建立講解一下~
參考之前的文章二叉樹的概要介紹
首先,定義一下關於二叉樹的結點資訊
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.中序遍歷 規則是若樹為空,則空操作返回,否則從根節點開...