二叉树的遍历(非递归方法)
1.preorderTraversal
由于先序遍历无需存储根节点的指针,可以很简单的设置这一个栈,当栈不空时弹出一个节点,访问,然后分别将左右子树压栈即可。
下面是第二种方法,模拟了递归的过程;
代码:
void preorder(TreeNode * root){ auto p = root; stack<TreeNode *> s; while(p || !s.empty()){ while(p){ visit(p); s.push(p); p = p->left; } if(!s.empty()){ p = s.top(); s.pop(); p = p->right; } } }
inorder:
中根遍历根先根遍历差不多,只不过把visit的操作移到了从栈中取节点的地方。
代码:
void inorder(TreeNode * root){ auto p = root; stack<TreeNode *> s; while(p || !s.empty()){ while(p){ s.push(p); p = p->left; } if(!s.empty()){ p = s.top(); s.pop(); visit(p); p = p->right; } } }
postorder:
后根遍历在回溯之后并不立即弹出栈,而是访问右子树,所有需要记录该节点的右子树是否被访问
代码:
void postorder(TreeNode* root) { stack<pair<TreeNode *,bool>> s; auto p = root; do{ while(p){ s.push(make_pair(p,false)); p = p->left; } while(!s.empty() && s.top().second == true) { visit(s.top().first); s.pop();
} if(!s.empty()) { s.top().second = true; p = s.top().first->right; } }while(!s.empty()); }
浙公网安备 33010602011771号