数据结构与算法之二叉树
文章目录
二叉树分类
二叉树主要分为:满二叉树和完全二叉树。
满二叉树:每一层结点都是满的,最终整棵树的结点总数为 2^k - 1。
完全二叉树:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 k 层,则该层包含 1~ 2k 个节点。
二叉树实现
二叉树单个结点
二叉树构建父节点与子节点之间的联系主要是通过指针来实现的。在结点结构中有一个val用来保存结点的值,left指针指向左子树,right指针指向右子树。结点结构代码如下:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {
}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {
}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {
}
};
二叉树的遍历操作
1、二叉树的前序遍历
前序遍历:先遍历根结点,再遍历左子树,最后遍历右子树
(1)迭代实现:注意栈是先进后出结构,所以应先将右子树入栈,再将左子树入栈
vector<int> preorderTraversal(TreeNode* root){
if(root == nullptr)
return {
};
stack<TreeNode*> stk;
vector<int> res;
stk.push(root);
while(!stk.empty()){
TreeNode* cur = stk.top();
stk.pop();
res.push_back(cur->val);
if(cur->right != nullptr)
stk.push_back(cur->right);
if(cur->left != nullptr)
stk.push_back(cur->left);
}
return res;
}
(2)递归实现
vector<int> preorderTraversal(TreeNode* root){
vector<int> res;
preorderRecursion(root, res);
return res;
}
void preorderRecursion(TreeNode* root, vector<int>& res){
if(root == nullptr)
return;
res.push_back(root->val);
preorderRecursion(root->left, res);
preorderRecursion(root->right, res);
}
2、二叉树的中序遍历
中序遍历:先遍历左子树,再遍历根结点,最后遍历右子树
(1)迭代实现:
vector<int> inorderTraversal(TreeNode* root){
stack<TreeNode*> stk;
vector<int> res;
TreeNode* cur = root