给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
2
/
3
输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
递归解法:
/** * 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 { vector<int> bNum; public: vector<int> postorderTraversal(TreeNode* root) { init(); bDfs(root); return bNum; } void bDfs(TreeNode* root) { if (root!= NULL) { bDfs(root->left); bDfs(root->right); bNum.push_back(root->val); } } void init() { bNum.clear(); } };
迭代解法:
/** * 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 { stack<TreeNode* > bNum; vector<int> num; public: vector<int> postorderTraversal(TreeNode* root) { init(); bfs(root); reverse(num.begin(), num.end()); return num; } void bfs(TreeNode* root) { while (root!= NULL|| ! bNum.empty()) { /* 后序遍历顺序为:左-右-根, 但迭代必须从根节点开始, 故我们按根-右-左的顺序遍历,然后翻转vector; */ while(root!= NULL) { num.push_back(root->val); bNum.push(root); root= root->right; //遍历root下所有右儿子,直到根节点; } root= bNum.top(); bNum.pop(); root= root->left; //遍历左子树; } } void init() { while (! bNum.empty()) bNum.pop(); num.clear(); } };