【leetcode】binary-tree-postorder-traversal

来源:互联网 发布:爱丁堡商学院申请 知乎 编辑:程序博客网 时间:2024/06/10 15:19

题目:

Given a binary tree, return the postorder traversal of its nodes' values.

For example:
Given binary tree{1,#,2,3},

   1    \     2    /   3


return[3,2,1].

Note: Recursive solution is trivial, could you do it iteratively?


问题分析:

非递归实现二叉树的后序遍历 ,使用栈保存好每次的根节点就好了 .。。

遍历需要注意的地方就是:判断当前的结点的 子树有没有访问完



代码分析:

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ #include<stack>//后序遍历二叉树class Solution {public:    vector<int> postorderTraversal(TreeNode *root) {        vector<int> ret;        stack<TreeNode*> data;        TreeNode*  prev = NULL;        if(root == NULL)            return  ret;        while(data.empty() == false||root)        {            while(root)            {                data.push(root);                root = root->left;            }            root =  data.top();//用来判断当前的结点的右结点有没有遍历过            if(root->right == NULL||(root->right == prev))            {                ret.push_back(root->val);                prev = root;                data.pop();                root = NULL;            }            else            {                root = root->right;            }           }        return ret;    }};



代码解析:


1、

  if(root->right == NULL||(root->right == prev))
这句代码使用的,使用的很是巧,

当前结点的有孩子为空 ,或者是当前结点右孩子已经被访问过了。才能访问当前的结点

2、

stack<TreeNode*> data;
使用栈来保存前面没有访问的结点;

3、

      TreeNode*  prev = NULL;
使用prev来保存的是上一个被访问的结点

0 0
原创粉丝点击