二叉树(二叉搜索树)的遍历算是相当经典了,如前序遍历、中序遍历、后序遍历,即可以用递归的方式实现,也可以用迭代的方式实现,还有诸如层次遍历、线索遍历等,这些算法构成了相当一部分面试题的基础。
1、前序遍历的递归实现,代码如下:
void preorderTraversal(TreeNode* root, vector<int>& res){
if(root==NULL) return ;
res.push_back(root->val);
preorderTraversal(root->left,res);
preorderTraversal(root->right,res);
}
2、中序遍历的递归实现,代码如下:
void inorderTraversal(TreeNode* root, vector<int>& res){
if(root==NULL) return ;
inorderTraversal(root->left,res);
res.push_back(root->val);
inorderTraversal(root->right,res);
}
3、后序遍历的递归实现,代码如下:
void postorderTraversal(TreeNode* root, vector<int>& res){
if(root==NULL) return ;
postorderTraversal(root->left,res);
postorderTraversal(root->right,res);
res.push_back(root->val);
}
上述三种递归方式非常简单,三者之间的唯一区别就是res.push_back()这句话的位置:放在最前面就是前序遍历,放在中间就是中序遍历,放在后面就是后序遍历。
4、前序遍历的迭代实现,需要要到一个栈,每次访问完根节点,把它的右子节点、左子节点分别压入栈中,代码如下:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
if(!root) return res;
stack<TreeNode*> s;
s.push(root);
while(!s.empty()){
Tre