樹相關演算法C++實現
阿新 • • 發佈:2021-11-18
樹遍歷方法大全
void fun(TreeNode* root) { if (!root)return; cout << root->val<<','; fun(root->left); fun(root->right); }//遞迴先序遍歷,中序、後序遍歷同理 void fun(TreeNode* root) { queue<TreeNode*> tmp; tmp.push(root); while (!tmp.empty()) { TreeNode* x = tmp.front(); if(x->left)tmp.push(x->left); if (x->right)tmp.push(x->right); cout << x->val << ' '; tmp.pop(); } }//層序遍歷 void fun(TreeNode* root) { stack<TreeNode*> tmp; while (!tmp.empty()||root) { while (root) { tmp.push(root); root = root->left; } root = tmp.top(); tmp.pop(); cout << root->val << ' '; root = root->right; } }//非遞迴中序遍歷,利用棧 void fun(TreeNode* root) { stack<TreeNode*> tmp; while (!tmp.empty()||root) { while (root) { tmp.push(root); cout << root->val << ' '; root = root->left; } root = tmp.top(); tmp.pop(); root = root->right; } }//和非遞迴中序遍歷比僅更改列印位置 void trifun(TreeNode *root){ stack<pair<TreeNode *,bool>> s; s.push(make_pair(root, false)); bool visited; while(!s.empty()){ root = s.top().first; visited = s.top().second; s.pop(); if(root == NULL)continue; if(visited)cout<<root->val<<' '; else{ s.push(make_pair(root, true)); s.push(make_pair(root->right, false)); s.push(make_pair(root->left, false));//後序遍歷,壓棧順序與自然順序相反,為中->右->左 } } }//樹三種非遞迴遍歷的改版
一個二叉樹遞迴的經典問題
題目:輸入一顆二叉樹的根節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一 直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前) 思路分析: (1)首先該題是基於遞迴去遍歷整棵樹,遍歷完每一條路徑,遍歷的順序是先根節點,然後是左節點,接著是右節點; (2)如果節點的左右子樹都為空,且路徑之和等於引數,就說明該路徑是需要輸出的 (3)如果不滿足條件,在遍歷完之後需要把最後一顆節點彈出來。class Solution { private: vector<vector<int>>ret; vector<int>temp; public: void def(TreeNode* root,int expectNumber){ temp.push_back(root->val); if(expectNumber - root->val ==0 &&root->left == NULL &&root->right== NULL)ret.push_back(temp); else{ if(root->left != NULL)def(root->left,expectNumber - root->val); if(root->right != NULL)def(root->right,expectNumber - root->val); } temp.pop_back(); } vector<vector<int> > FindPath(TreeNode* root,int expectNumber) { if(root == NULL)return ret; def(root,expectNumber); return ret; } };