日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 145 ——二叉树的后序遍历

發布時間:2024/4/13 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 145 ——二叉树的后序遍历 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 題目

2. 解答

2.1. 遞歸法

定義一個存放樹中數據的向量 data,從根節點開始,如果節點不為空,那么

  • 遞歸得到其左子樹的數據向量 temp,將 temp 合并到 data 中去
  • 遞歸得到其右子樹的數據向量 temp,將 temp 合并到 data 中去
  • 將當前節點的數值加入到 data 中
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:vector<int> preorderTraversal(TreeNode* root) {vector<int> data = {};vector<int> temp = {};if (root != NULL){temp = postorderTraversal(root->left);data.insert(data.end(),temp.begin(),temp.end());temp = postorderTraversal(root->right);data.insert(data.end(),temp.begin(),temp.end());data.push_back(root->val);}return data; } };
2.2. 迭代法一
仿照前序遍歷的思想,只不過這次我們的順序為中-右-左,然后倒序將其加入到向量中,即為后序左-右-中的結果。

定義一個存放樹中節點的棧 node_stack 和存放數據的向量 data,從根節點開始,如果節點不為空或者棧非空,循環以下過程:

  • 如果節點非空,將節點的值加入 data 的頭部,如果節點有左孩子,將節點左孩子壓入棧,節點指向其右孩子,循環直到節點為空
  • 如果節點為空,棧非空,則彈出棧頂節點
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:vector<int> preorderTraversal(TreeNode* root) {// 按照中右左前序遍歷,倒序存儲即為左右中vector<int> data = {};stack<TreeNode*> node_stack;TreeNode* temp = root;while (temp || !node_stack.empty()){while(temp != NULL){data.insert(data.begin(), temp->val); // 在頭部插入if (temp->left) node_stack.push(temp->left);temp = temp->right;}// 若最后一個節點沒有左子節點,棧為空if (!node_stack.empty()) // 棧非空{temp = node_stack.top();node_stack.pop();}}return data;} };
2.3. 迭代法二
后序遍歷的話只有某一節點的左右子節點都被訪問過之后才能訪問該節點。

定義一個存放樹中節點的棧 node_stack 和存放數據的向量 data,如果樹非空,先將根節點壓入棧。

cur 指向當前節點,pre 指向上一次訪問的節點,初始化為空,然后棧非空則循環以下過程:

當前節點為棧頂節點

  • 如果節點左右子節點都為空或者上一次訪問的節點為其左右子節點中的一個,(某些節點可能只有一個子節點,所以 pre 不能為空,然后若只有左子節點,則上一次訪問的為其左子節點;若有左右子節點,按照壓棧順序,則上一次訪問的為其右子節點;)則彈出棧頂節點,將節點數據加入 data,將上一次訪問的節點指向當前節點
  • 否則,如果存在左右子節點,先壓入其右子節點,再壓入其左子節點
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:vector<int> preorderTraversal(TreeNode* root) {vector<int> data = {};stack<TreeNode*> node_stack;if (root) node_stack.push(root); // 樹非空,先將根節點壓入棧TreeNode* cur = root; // 當前節點TreeNode* last = NULL; // 上一次訪問的節點while (!node_stack.empty()){cur = node_stack.top();if ((cur->left == NULL && cur->right == NULL) || (last != NULL && (cur->left == last || cur->right == last))){data.push_back(cur->val);node_stack.pop();last = cur;}else{if (cur->right) node_stack.push(cur->right);if (cur->left) node_stack.push(cur->left);}}return data;} };

參考資料

獲取更多精彩,請關注「seniusen」!

總結

以上是生活随笔為你收集整理的LeetCode 145 ——二叉树的后序遍历的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。