题目链接:https://leetcode.com/problems/binary-tree-postorder-traversal/
(非递归实现)二叉树的后序遍历。
1 class Solution 2 { 3 public: 4 vector<int> postorderTraversal(TreeNode *root) 5 { 6 vector<int> output; 7 if(root == NULL) 8 { 9 return output; 10 } 11 12 stack<TreeNode*> nodeStack; 13 TreeNode *recentlyVisited = NULL; 14 15 while(root != NULL || !nodeStack.empty()) 16 { 17 if(root != NULL) 18 { 19 nodeStack.push(root); 20 root = root->left; //找到最左边的叶子节点。 21 } 22 else //左子树为空。 23 { 24 root = nodeStack.top(); //回退一个节点。 25 if(root->right != NULL && root->right != recentlyVisited) //右子树不为空并且未访问过。 26 { 27 root = root->right; 28 nodeStack.push(root); 29 root = root->left; 30 } 31 else //右子树为空或者已访问过。 32 { 33 root = nodeStack.top(); //回退一个节点。 34 nodeStack.pop(); //从栈中删除该节点(刚才只回退过,没有删除)。 35 output.push_back(root->val); //输出该节点。 36 recentlyVisited = root; //记录下右子树的访问情况(记录的过程是从下至上的)。 37 root = NULL; //左右子树输出完毕,重置这个节点,在下次进入循环的时候会分配给它栈顶的节点。 38 } 39 } 40 } 41 42 return output; 43 } 44 };
时间: 2024-10-12 04:54:38