145. Binary Tree Postorder Traversal

仅供自己学习

 

思路:

第一种就是递归的后序遍历,直接按模板来就可以了

代码:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10  * };
11  */
12 class Solution {
13 private:
14     vector<int> res;
15 public:
16     vector<int> postorderTraversal(TreeNode* root) {
17         if(root==NULL) return res;
18         if(root->left) postorderTraversal(root->left);
19         if(root->right) postorderTraversal(root->right);
20         res.push_back(root->val);
21         return res;
22     }
23 };

 

另外一种迭代,就是用栈。

我们定义一个pre,用来保证不会重复访问同一个节点。一开始我们从源点一直遍历左节点,并以此添加进栈中,直到加入所有源点左子树中左节点的左节点。然后取出栈顶元素并pop掉,判断他有没有右子树,如果有右子树,那么就把取出的的栈顶元素再次加入进栈,并且root指向该节点右子树,然后下一次循环在判断有没有左节点。如果没有右子树,那么就把该点val值加入进res数组,然后并用pre记录该节点防止重复访问,然后root=NULL,这样是因为我们我们加入左节点的判断条件是root不为空。

 

代码:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10  * };
11  */
12 class Solution {
13 public:
14     vector<int> postorderTraversal(TreeNode* root) {
15         vector<int> res;
16         stack<TreeNode*> st;
17         TreeNode* pre=NULL;
18         while(!st.empty()||root!=NULL){
19             while(root){
20                 st.push(root);
21                 root=root->left;
22             }
23             root = st.top(); st.pop();
24             if(root->right&&root->right!=pre){ 
25                 st.emplace(root); //如果有右节点却不重新加入取出的栈顶元素,那么会少中间节点的val值
26                 root=root->right; //这样才会在wihle(root)那里进行判断这个右节点有没有左节点,有就加入,没有就不进入while。
27             }
28             else{
29                 res.emplace_back(root->val);
30                 pre=root;
31                 root=NULL;  //是因为while(root)需要root为空才不进入
32             }
33         }
34         return res;
35     }
36 };

 

posted @ 2021-03-16 11:40  Mrsdwang  阅读(46)  评论(0)    收藏  举报