二叉樹的相關學習

2021-07-06 10:08:34 字數 3290 閱讀 1923

二叉樹是樹中比較重要的乙個部分,對於二叉樹的建立,還有遍歷方式,主要分後序,中序,前序的遍歷,而這個的前中後主要是根節點的訪問順序的不同,左子樹和右子樹的訪問順序是一樣的,這其實是乙個遞迴的順序,因為訪問到乙個根節點的時候,又可以把下面的節點看成是一顆樹,也可以用非遞迴,也就是佇列或棧的方式來訪問樹,還有acm的一道題目是已知前序,中序遍歷,來叫你寫出後序遍歷的題目,只有知道兩種訪問順序,才能構造出一顆完整的樹!

採用先序遍歷的方式來建立樹 先是輸入根節點,隨後輸入左子樹再輸入右子樹,若為空格,則表示左子樹不存在或右子樹不存在 因此 本次實驗報告的輸入為

abd11g111ce11fh111 1代表空格

//先序建立二叉樹 輸入時候唯讀入乙個字元,所以用getchar,

treepointer createtree()

return ptree;

}

之後是遞迴的前序後序中序來遍歷這棵樹 **比較簡單

//先序遍歷的遞迴,先訪問根節點,再訪左子樹,隨後訪問右子樹

void recursive_preorder(treepointer ptr)

}//中序遍歷的遞迴,先訪問左子樹,再訪問根節點,隨後訪問右子樹

void recursive_inorder(treepointer ptr)

}//後序遍歷的遞迴,先訪問左子樹,再訪右子樹,隨後訪問根節點

void recursive_postorder(treepointer ptr)

}

之後是層次的遍歷,類似於廣搜,用到了佇列,如果左孩子存在,左孩子入佇列,右孩子存在,右孩子入佇列

//層次遍歷的遞迴呼叫,要用到佇列的操作void level_order(treepointer ptr) 

else

break;

}}

非遞迴的**明天再補上

非遞迴前序 主要是當棧不為空的前提下,先把根的結果輸出,隨後壓入棧時注意,先把右子樹壓入,再左子樹壓入,因為是後進先出

//先序非遞迴的遍歷

void iter_preorder(treepointer ptr)

}

非遞迴的中序,也是在棧不為空的前提下,先讓左子樹的節點全部入棧,隨後彈出棧,輸出結果,再變成他的右子樹

//中序非遞迴遍歷 先讓左子樹都入棧,當左子樹為空的時候,則彈出棧頂的元素,進行輸出,隨後他自己變成自己的右孩子

void iter_inorder(treepointer ptr)

cur = s[top--].key;

cout << cur->data << " ";

cur = cur->rightchild;

}}

非遞迴的後序 ,要定義乙個指標表示他的右子樹是否被訪問過,首先也是左子樹全部入棧,之後再判斷右孩子是否為空或已經被訪問過,如果是空的或已經訪問過了,則輸出當前元素的值,否則他變成他的右子樹

//後序非遞迴遍歷

void iter_postorder(treepointer ptr)

cur = s[top].key;

//當前右孩子如果為空或者已經被訪問,則訪問當前的節點

if (cur->rightchild == previsited||cur->rightchild==null)

else

cur = cur->rightchild;

}}

之後是統計節點的個數,也是用到遞迴的操作,左孩子和右孩子碰到,節點個數就加1 

//統計節點的個數 

//統計節點的個數 

int counttree(treepointer ptr)

return 0;

}

統計葉節點的個數 也用到了遞迴 當左子樹和右子樹都不存在的時候,則它就為葉節點

//統計葉節點的個數

int count = 0;

void countleaf(treepointer ptr)

else

}

統計樹的高度

//統計樹的高度

int height = 0;

int treeheight(treepointer ptr)

if (ptr->rightchild)

if (ptr)

return 1;

}

主函式的測試**:

int main() {

treepointer ptr = null;

cout << "先序遍歷建立樹,空號代表該節點無左子樹或右子樹:";

ptr = createtree();

cout << "遞迴前序遍歷:";

recursive_preorder(ptr);

cout << endl;

cout << "遞迴中序遍歷:";

recursive_inorder(ptr);

cout << endl;

cout << "遞迴後序遍歷:";

recursive_postorder(ptr);

cout << endl;

cout << "層次遍歷:";

level_order(ptr);

cout << endl;

cout << "非遞迴前序:";

iter_preorder(ptr);

cout << endl;

cout << "非遞迴中序:";

iter_inorder(ptr);

cout << endl;

cout << "非遞迴後序:";

iter_postorder(ptr);

cout << endl;

cout << "節點個數:";

cout << counttree(ptr)結果:

參考的幾個部落格

已知前序和中序 求後序的演算法

二叉樹 二叉樹的相關操作

遞迴實現 建立求樹高 求葉子數 求節點數 統計度為2的結點個數 後序輸出 先序輸出 中序輸出 交換左右子樹 include include include define true 1 define false 0 define ok 1 define error 0 define overflow ...

二叉樹相關

1.首先建立乙個樹節點,節點有值,左節點和右節點 author 張夢楠 title package description date 2018 5 2519 27 blog www.itzmn.com 樹的節點類 public class treenode public treenode int v...

二叉樹相關

廣度優先遍歷 對於每層的節點,放到乙個用來處理節點佇列裡,另外每個佇列對應乙個vector,將每層節點放進vector 對於每個佇列,彈出先放的元素q.front,將這個元素放進vector,隨後,將左節點和右子節點放進佇列 class solution queue q q.push root wh...