目录:
一、二叉树的非递归遍历【前中的差别只有一句位置不同! 后序最特殊】
两种方法:1.用栈 2.用Morris
栈:
因为所谓的前中后序都是深度优先遍历,所以用栈数据结构。广度(按层/之字)遍历时才用队列数据结构。
例:树从上往下 从左往右是abcdefghi。
前序:a b d h i e c f g
中序:h d i b e a f c g
后序:h i d e b f g c a
三种写法特点:
1.下划线处是内层while循环的依据。
2.外层的while循环体内都是6句:
压入栈
压入vector(后序是插入)
root更新为左子树
root更新为右子树
root = 栈顶
pop栈顶
*********
preorder:
*********
vector<int> PreorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> nodeStack;
while (root || !nodeStack.empty()) {
while (root) {
nodeStack.push(root);
result.push_back(root->val);
root = root->left;
}
root = nodeStack.top();
nodeStack.pop();
root = root->right;
}
return result;
}
*********
inorder:
*********