彦祖天天见
二叉树是一种常见的树状数据结构,它由一组称为节点的元素组成,这些节点通过边连接在一起。每个节点最多有两个子节点,分别称为左子节点和右子节点。左子节点在树中的位置相对于父节点来说是左侧的,右子节点在树中的位置相对于父节点来说是右侧的。
二叉树的一个特殊情况是空树,即没有任何节点的二叉树。除了空树之外,每个二叉树都有一个根节点,它是树的顶部节点,没有父节点。
二叉树的节点可以存储任意类型的数据,例如整数、浮点数、字符等。每个节点通常包含一个值和指向左子节点和右子节点的指针。
二叉树可以用于解决各种问题,例如搜索、排序、遍历等。常见的二叉树遍历方式有三种:前序遍历、中序遍历和后序遍历。前序遍历先访问根节点,然后递归地遍历左子树和右子树。中序遍历先递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。后序遍历先递归地遍历左子树和右子树,最后访问根节点。
二叉树的应用非常广泛,例如在计算机科学中用于构建搜索树、表达式树和哈夫曼树等。它还可以用于解决各种算法和数据结构问题,例如二叉搜索树用于快速查找和插入数据,平衡二叉树用于提高搜索和插入的效率,二叉堆用于实现优先队列等,如图为二叉树的结构。
二叉树主要有两种遍历方式:
- 深度优先遍历:先往深走,遇到叶子节点再往回走。
- 广度优先遍历:一层一层的去遍历。
- 深度优先遍历
- 前序遍历
- 中序遍历
- 后序遍历
- 广度优先遍历
- 层次遍历
前,中,后序遍历如图所示。
下面是二叉树的迭代写法:
题目:144.二叉树的前序遍历https://leetcode.cn/problems/binary-tree-preorder-traversal/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if(root==NULL) return result;
st.push(root);
while(!st.empty()){
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
//因为栈是后进先出的结构,所以右节点在左节点前面
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
}
return result;
}
};
二叉树的递归前序遍历:
题目:二叉树的前序遍历https://leetcode.cn/problems/binary-tree-preorder-traversal/
class Solution {
public:
void front(TreeNode* root,vector<int>& res) {
if(root == nullptr) return;
res.push_back(root->val);
front(root->left,res);
front(root->right,res);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
front(root,res);
return res;
}
};
二叉树的层序遍历
题目:二叉树的层序遍历
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
//一层一层的遍历可以使用队列先进先出的特性
queue<TreeNode*> team;
vector<vector<int>> res;
if(root == NULL) return res;
team.push(root);
while(!team.empty()){
//每次遍历完一层重新获取下一层的大小
int size=team.size();
vector<int> cur;
for(int i=0;i<size;i++){
TreeNode* node = team.front();
team.pop();
cur.push_back(node->val);
if(node->left) team.push(node->left);
if(node->right) team.push(node->right);
}
res.push_back(cur);
}
return res;
}
};