文章目录
推导遍历结果
例题: 前序遍历序列为ABCDEF,中序遍历序列CBAEDF,请问后续遍历序列是?
先分析出A是根结点,那么从中序可以看出 B,C是A的左子树上结点,D,E,F是A的右子树上结点,在看B,C前序先输出B,则B是A的左孩子,C是B的结点,从中序可以看出先输出C,在输出B,则C是B的左孩子,同理前序可以看出D是A的右孩子,E,F是D的孩子结点,中序可以看出先输出E,D,F,则E是D的左孩子,F是D的右孩子。
最终二叉树为
- 已知前序遍历序列和中序遍历序列,可以唯一确定一颗二叉树
- 已知后序遍历序列和中序遍历序列,可以唯一确定一颗二叉树
- 已知前序和后序遍历,不能唯一确定一颗二叉树
层序遍历相关
//二叉树的节点定义
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) :val(x), left(NULL), right(NULL) {
}
};
二叉树层序遍历
- 描述: 需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
vector<vector<int>> result;
while (!que.empty()) {
int size = que.size();
vector<int> vec;
// 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
result.push_back(vec);
}
return result;
}
二叉树层次遍历2
层次遍历2
给定一个二叉树,返回其节点值自底向上的层次遍历(从叶节点所在层到根节点所在层,逐层从左向右遍历)
//给定一个二叉树,返回其节点值自底向上的层次遍历。
//(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历
//二叉树的层序遍历,就是最后把result数组反转一下就可以
vector<vector<int>> LevelOrder_2(TreeNode* root)//输出一个二维数组
{
queue<TreeNode*> qu;
vector<vector<int>> res;
if (root != NULL) qu.push(root);
while (!qu.empty())
{
int size = qu.size();
// 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
vector<int> vec;
for (int i = 0; i < size; i++)
{
TreeNode* t = qu.front();
qu.pop();
vec.push_back(t->val);//把本层的节点数据都存入数组中
if (root->left) qu.push<