二叉树遍历
先修知识点
用到的算法:
1.函数push_back,算法语言里面的一个函数名用于在vector容器后面加一个数据,v.push_back(val)如:
1) c++中的vector头文件里面就有这个push_back函数;
2) 在vector类中作用为在vector尾部加入一个数据;
3) string中也有这个函数,作用是字符串之后插入一个字符。
2.函数insert,向vector容器中添加数据,v.insert(),用法如下:
- v.insert(v.begin(),1);在最前面插入新元素
- v.insert(v.begin()+1,2);在迭代器中第二个元素前插入新元素
- v.insert(v.end(),3);在向量末尾追加新元素
- v.insert(v.end(),4,1);在尾部插入4个1
- v.insert(v.end(),a[i],a[j]);在尾部插入a[i]个a[j],其中a[]为数组
- v.insert(v.begin(),v1.begin(),v1.end());在v的前面,插入v1整个容器。
对于迭代器(一种复杂的指针),begin()指向的是vector容器的第一个元素的位置;end()指向的是vector容器的最后一个元素之后的位置。insert是在指针指向的位置之前插入元素。(大神说这样使得vector.end()赋值的时候要:end()-1)
迭代器定义:vector::iterator iter1;
遍历实现:
前序遍历
前序遍历的顺序是,根左右:根据树类数据,不断地递归就可以得到前序遍历。
(根左右——>根 左 左左子 左右子 右 右左子 右右子)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root)
{
vector<int> preorder;
if(root)
{
preorder.push_back(root->val);
vector<int> left=preorderTraversal(root->left);
preorder.insert(preorder.end(),left.begin(),left.end());
vector<int> right=preorderTraversal(root->right);
preorder.insert(preorder.end(),right.begin(),right.end());
}
return preorder;
}
};
先插入根:push_back();
再左:全部的左子树。preorder.insert(preorder.end(),left.begin(),left.end());left通过递归不断更新容器 添加数据。
最后右:全部的右子树。preorder.insert(preorder.end(),right.begin(),right.end());left通过递归不断更新容器 添加数据。
中序遍历
中序遍历的顺序是,左根右:根据树类数据,不断地递归就可以得到中序遍历。
(左根右——> 左左子 左 左右子 根 右左子 右 右右子)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root)
{
vector<int> inorder;
if(root)
{
vector<int> left=inorderTraversal(root->left);
inorder.insert(inorder.begin(),left.begin(),left.end());
inorder.push_back(root->val);
vector<int> right=inorderTraversal(root->right);
inorder.insert(inorder.end(),right.begin(),right.end());
}
return inorder;
}
};
先在根的左边插入左子树。inorder.insert(inorder.begin(),left.begin(),left.end());
再插入根。push_back
最后在根的右边插入右子树。inorder.insert(inorder.end(),right.begin(),right.end());
后序遍历
后序遍历的顺序是,左右根:根据树类数据,不断地递归就可以得到后序遍历。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root)
{
vector<int> postorder;
if(root)
{
vector<int> left=postorderTraversal(root->left);
postorder.insert(postorder.begin(),left.begin(),left.end());
vector<int> right=postorderTraversal(root->right);
postorder.insert(postorder.end(),right.begin(),right.end());
postorder.push_back(root->val);
}
return postorder;
}
};
先插入左。postorder.insert(postorder.begin(),left.begin(),left.end());
再插入右。postorder.insert(postorder.end(),right.begin(),right.end());
最后插入根。push_back