#include<iostream> #include<stack> #include<queue> #include<string> #include<deque> using namespace std; struct Node { int data; Node* left; Node* right; Node(){ data = 0; left = nullptr; right = nullptr; } Node(int a){ data = a; left = nullptr; right = nullptr; } }; void preOrder(Node* p) { if (p == nullptr)return; stack<Node*>st; while (p || !st.empty()) { while (p) { cout << p->data << " "; st.push(p); p = p->left; } if (!st.empty()) { Node* temp = st.top(); st.pop(); p = temp->right; } } } void inOrder(Node* p) { if (p == nullptr)return; stack<Node*>st; while (p || !st.empty()) { while (p) { st.push(p); p = p->left; } if (!st.empty()) { Node* p = st.top(); st.pop(); cout << p->data << " "; p = p->right; } } } void postOrder1(Node* p) { if (p == nullptr)return; stack<Node*>st; Node* plast = nullptr; while (p) { st.push(p); p = p -> left; } while (p || !st.empty()) { p = st.top(); st.pop(); if (p->right == nullptr || p->right == plast) { cout << p->data << " "; plast = p; } else { st.push(p); p = p->right; while (p) { st.push(p); p = p->left; } } } } void postOrder2(Node* p) { if (p == nullptr)return; stack<Node*>st1, st2; st1.push(p); while (!st1.empty()) { Node* temp = st1.top(); st2.push(temp); if (temp->left != nullptr) { st1.push(temp->left); } if (temp->right != nullptr) { st1.push(temp->right); } } while (!st2.empty()) { cout << st2.top()->data << " "; st2.pop(); } } void levelOrder(Node* p) { if (p == nullptr)return; queue<Node*>qu; qu.push(p); while (!qu.empty()) { p = qu.front(); cout << p->data << " "; qu.pop(); if (p->left != nullptr) { qu.push(p->left); } if (p->right != nullptr) { qu.push(p->right); } } } int widthOfTree(Node* p) { int max = INT_MIN; deque<Node*>de1, de2; de1.push_back(p); do { ///下面的if改爲count++即爲非遞歸求樹的深度 if (de1.size() > max) { max = de1.size(); } do { p = de1.front(); de1.pop_front(); if (p->left != nullptr) { de2.push_back(p->left); } if (p->right != nullptr) { de2.push_back(p->right); } } while (!de1.empty()); de1.swap(de2); } while (!de1.empty()); return max; } Node* findNode(Node* root, int val) { ///對數進行後續遍歷,當訪問節點時判斷節點是否值爲val,如爲val return node return nullptr; } ////打印全部葉子節點到根節點的路徑也是用的後續遍歷,當訪問的葉子節點時,棧中存在的值即爲該葉子節點的路徑 ///以及打印兩個葉子節點的路徑,即先找出兩個葉子節點到根的路徑,再找出最初的公共的節點便可 ///二叉樹的最大距離,採用遞歸,參考網址: int main() { }