思路一
借鉴先序和中序遍历,两个辅助栈实现
void bfs(TreeNode* root){if (!root)return;stack<TreeNode*> s1;stack<TreeNode*> s2;TreeNode *p = root;while (!s1.empty() || p){while (p){s1.push(p);s2.push(p);p = p->right;}p = s1.top();s1.pop();p = p->left;}while (!s2.empty()){cout << s2.top()->val << endl;//后序遍历s2.pop();}}
思路二
用一个额外结点存前一个结点,记录前一个结点和当前结点信息
void bfs(TreeNode* root){if (!root)return;stack<TreeNode*> s;TreeNode *cur = root, *pre = nullptr;s.push(root);while (!s.empty()){cur = s.top();if (!pre || pre->left == cur || pre->right == cur){//如果pre为空或pre是cur的父节点if (cur->left)s.push(cur->left);else if (cur->right)s.push(cur->right);}else if (cur->left == pre){//如果pre是cur的左孩子if (cur->right)s.push(cur->right);}else{//如果pre和cur相同或pre是cur的右孩子cout << cur->val << endl;s.pop();}pre = cur;}}
