二叉樹是樹中比較重要的乙個部分,對於二叉樹的建立,還有遍歷方式,主要分後序,中序,前序的遍歷,而這個的前中後主要是根節點的訪問順序的不同,左子樹和右子樹的訪問順序是一樣的,這其實是乙個遞迴的順序,因為訪問到乙個根節點的時候,又可以把下面的節點看成是一顆樹,也可以用非遞迴,也就是佇列或棧的方式來訪問樹,還有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...