树的非递归遍历
树的非递归遍历
前序遍历和中序遍历
//前序遍历
vector<int> res;
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
while(!stk.empty()||root!=NULL){
if(root!=NULL){
res.push_back(root->val);
stk.push(root);
root = root->left;
}else{
root = stk.top();
stk.pop();
root = root->right;
}
}
return res;
}
//中序遍历
vector<int> res;
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
while(!stk.empty()||root!=NULL){
if(root!=NULL){
stk.push(root);
root = root->left;
}else{
root = stk.top();
res.push_back(root->val);
stk.pop();
root = root->right;
}
}
return res;
}
后序遍历
vector<int> res;
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
TreeNode* r;//上一个访问的是谁
while(!stk.empty()||root!=NULL){
if(root!=NULL){
stk.push(root);
root = root->left;
}else{
//右子树没有访问
if(stk.top()->right!=NULL&&stk.top()->right!=r){
root = stk.top()->right;
}else{
//右子树已经访问,所以访问父节点
res.push_back(stk.top()->val);
r = stk.top();
stk.pop();
}
}
}
return res;
}
后续遍历的特点:
访问一个节点p时,栈中的结点刚好是p结点的所有祖先,从栈底到栈顶即一条根到p的路径
相关题目:
1.求根到某结点的路径
2.求俩个结点的最近公共祖先

浙公网安备 33010602011771号