代码随想录理论知识文章链接代码随想录 (programmercarl.com)
|、二叉树理论基础
一、二叉树的种类
完全二叉树底层必须是从左到右依次填满的 。
二叉搜索树对节点布局没有要求但是结点上的元素有一定的顺序,比如左节点小于中间节点,中间节点小于右节点。
平衡二叉搜索对节点布局的要求是树的左右子树高度差不能大于1(高度取的是左子树右子树最大的那个值),结点上元素要有一定顺序
二、二叉树的遍历
1、深度优先搜索
前中后序排序(方法:递归法、迭代法)
2、广度优先遍历
层序遍历(方法:递归法)
三、二叉树的定义
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
||、二叉树递归类型的题目
1、确定递归函数的参数返回值
2、确定终止条件
3、确定单层循环的逻辑
144.二叉树的前序遍历
题目链接https://leetcode.cn/problems/binary-tree-preorder-traversal/description/
/**
* Definition for a binary tree node.
* 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) {}
* };
*/
void travel(TreeNode* root,vector<int>& vec){//要调用vec的push函数这里只能接收vec的引用
if(root==NULL)return;//root要判断是否指向为空,所以要接收为指针
vec.push_back(root->val);//中
travel(root->left,vec);//左
travel(root->right,vec);//右
}
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> vec;
travel(root,vec);
return vec;
}
};
145.二叉树的后序遍历
题目链接https://leetcode.cn/problems/binary-tree-postorder-traversal/description/
/**
* Definition for a binary tree node.
* 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) {}
* };
*/
void travel(TreeNode* root,vector<int>& vec){
if(root==NULL)return;
travel(root->left,vec);//左
travel(root->right,vec);//右
vec.push_back(root->val);//根
}
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> vec;
travel(root,vec);
return vec;
}
};
94.二叉树的中序遍历
题目链接https://leetcode.cn/problems/binary-tree-inorder-traversal/description/
/**
* Definition for a binary tree node.
* 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) {}
* };
*/
void travel(TreeNode* root,vector<int>& vec){
if(root==NULL)return;
travel(root->left,vec);//左
vec.push_back(root->val);//根
travel(root->right,vec);//右
}
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> vec;
travel(root,vec);
return vec;
}
};